参数
函数内部可用的 arguments
对象来访问函数的实参
注意
- 在函数递归调用的时候(在某一刻同一个函数运行了多次,也就是有多套实参),那么
arguments
属性的值是最近一次该函数调用时传入的实参 - 如果函数不在执行期间,那么该函数的
arguments
属性的值是null
arguments
对象不是一个Array
。它类似于Array
,但除了length属性和索引元素之外没有任何Array
属性。例如,它没有 pop 方法,但是可以使用Array.prototype.pop.call(arguments,obj)借用Array方法- 使用扩展运算符的方法可以讲arguments对象展开成一个真正的数组 例如:
var args = [...arguments];
- argument.callee 属性包含正在执行函数,这在函数的名称是未知时很有用,例如在没有名称的函数表达式 (也称为“匿名函数”)内
//计算阶乘 function factorial(n){ if(n == 1){ return 1 } return n*arguments.callee(n-1); } console.log(factorial(5));
bind 方法
JavaScript新手经常犯的一个错误是将一个方法从对象中拿出来,然后再调用,希望方法中的 this 是原来的对象(比如在回调中传入这个方法)。如果不做特殊处理的话,一般会丢失原来的对象。从原来的函数和原来的对象创建一个绑定函数
var module = {
x: 42,
getX: function() {
return this.x;
}
}
var unboundGetX = module.getX;
console.log(unboundGetX()); // 这里输出的是全局环境下 x 变量
var boundGetX = unboundGetX.bind(module); //绑定对象
console.log(boundGetX());
// expected output: 42
箭头函数
在箭头函数出现之前,每个新定义的函数都有它自己的 this
值(在构造函数的情况下是一个新对象,在严格模式的函数调用中为 undefined,如果该函数被称为“对象方法”则为基础对象等)例如
function Person() {
// Person() 构造函数定义 `this`作为它自己的实例.
this.age = 0;
setInterval(function growUp() {
// 在非严格模式, growUp()函数定义 `this`作为全局对象,
// 与在 Person()构造函数中定义的 `this`并不相同.
this.age++;
}, 1000);
}
var p = new Person();
过去的解决办法是在 Person中新建一个变量指向this 例如 var that = this
箭头函数的出现解决了这个问题,箭头函数不会创建属于自己的this,它使用封闭执行上下文的this值。因此,在下面的代码中,传递给setInterval的函数内的this与封闭函数中的this值相同
function Person(){
this.age = 0;
setInterval(() => {
this.age++; // |this| 正确地指向person 对象
}, 1000);
}
var p = new Person();
注意
- 箭头函数不绑定Arguments 对象
- 箭头函数只能用于非方法函数
- 箭头函数不能作为构造函数
- 箭头函数没有property属性
最后来看一下箭头函数使用语法
(参数1, 参数2, …, 参数N) => { 函数声明 }
(参数1, 参数2, …, 参数N) => 表达式(单一)
//相当于:(参数1, 参数2, …, 参数N) =>{ return 表达式; }
// 当只有一个参数时,圆括号是可选的:
(单一参数) => {函数声明}
单一参数 => {函数声明}
// 没有参数的函数应该写成一对圆括号。
() => {函数声明}
默认参数
JS函数也可以在声明参数时赋默认值,如果不给默认值,JavaScript 中函数的参数默认是undefined
function multiply(a, b = 1) {
return a * b;
}
剩余参数
剩余参数语法允许我们将一个不定数量的参数表示为一个数组
function(a, b, ...theArgs) {
// ...
}
剩余参数和 arguments对象之间的区别主要有三个:
- 剩余参数只包含那些没有对应形参的实参,而 arguments 对象包含了传给函数的所有实参。
- arguments对象不是一个真正的数组,而剩余参数是真正的 Array实例,也就是说你能够在它上面直接使用所有的数组方法,比如 sort,map,forEach或pop。
- arguments对象还有一些附加的属性 (如callee属性)