JavaScript(二)函数
函数也存在提升,与变量提升相同
-
函数声明
function func_name(param1,param2){
...;
return {};
}
-
声明不定长参数,使用
...
function foo(a, b, ...args) {
console.log('a = ' + a);
console.log('b = ' + b);
console.log(args);
}
-
声明默认值参数,同python
function multiply(a, b = 1) {
return a * b;
}
-
关键字参数。同python
function multiply(a, b) {
return a * b;
}
multiply(a=1, b=2)
-
参数关键字
arguments
,它只在函数内部起作用,并且永远指向当前函数的调用者传入的所有参数。arguments
类似Array
但它不是一个
JavaScript默认有一个全局对象window
,全局变量会绑定到window
上,不同的JavaScript文件如果使用了相同的全局变量,或者定义了相同名字的顶层函数,都会造成命名冲突,并且很难被发现。
减少冲突的一个方法是把自己的所有变量和函数全部绑定到一个全局变量中。例如:
// 唯一的全局变量MYAPP:
var MYAPP = {};
// 其他变量:
MYAPP.name = 'myapp';
MYAPP.version = 1.0;
把自己的代码全部放入唯一的名字空间MYAPP
const [p1,p2,p3]= [1,2,3] const {对象的属性,对象的方法} = 对象 // 变量名和属性名不一致 const {k1,k2:new_k2}=对象
一个函数内部调用了this
:
-
如果是一个对象调用此函数,
this
指向这个对象 -
直接调用此函数(即顶层对象window调用此函数),
this
指向window
要指定函数的this
指向哪个对象,可以用函数本身的apply
方法,它接收两个参数,第一个参数就是需要绑定的this
变量,第二个参数是Array
function add(){...} add.apply(obj1,[p1,p2,p3]) add.apply(null,[p1,p2,p3]) //传入的对象是null,普通函数调用,无this
-
apply()
把参数打包成Array
再传入; -
call()
高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值
function lazy_sum(arr) { var sum = function () { return arr.reduce(function (x, y) { return x + y; }); } return sum; } //调用lazy_sum()时,返回的并不是求和结果,而是求和函数 var f = lazy_sum([1, 2, 3, 4, 5]); // function sum() //调用函数f时,才真正计算求和的结果 f(); // 15
// 定义 var fn1 = function(x,y) {return x+Y}; // 定义并调用 (function (x) { return x * x }) (3);
在没有class
箭头函数相当于匿名函数,并且简化了函数定义。箭头函数有两种格式:
-
一种只包含一个表达式,连
{ ... }
和return
var fn = x => x * x;
x => { if (x > 0) { return x * x; } else { return - x * x; } }
// 两个参数: (x, y) => x * x + y * y // 无参数: () => 3.14 // 可变参数: (x, y, ...rest) => { var i, sum = x + y; for (i=0; i<rest.length; i++) { sum += rest[i]; } return sum; }
x => ({ foo: x })
一个generator看上去像一个函数,但可以返回多次
generator和函数不同的是,generator由function*
定义(注意多出的*
号),并且,除了return
语句,还可以用yield
返回多次。类似