arguments是所有函数内部可以使用的一个局部变量,是一个类数组对象。之所以说是类数组对象,是因为它具有Array一样的length属性,但是其不具备Array的其它属性。
var arr = [];
arr instanceof Array; // true;
function f() {console.log(arguments instanceof Array);}
f(); //false
arguments类数组对象建立了与函数的实参的联系,可以使用[]操作符像访问数组一样访问传入的实参并且可以修改实参的值,arguments.length表示了传入实参的个数。利用这一特性,我们可以模拟JS的函数重载。
//使用arguments模拟函数重载,实现不确定个数的数的加法
function f() {
var sum = 0,
len = arguments.length;
if (len === 1) {
sum = arguments[0];
} else if (len > 1) {
sum = Array.from(arguments).reduce(function (result, val){
return result + val;
}, 0);
}
return sum;
}
arguments对象还有两个常见属性callee和caller。为了更清楚地了解arguments,使用浏览器console打印出其相关信息:
可以看出,arguments的原型是Object,其属性callee是一个函数,指向其自身。
arguments.callee指向函数体内当前正在执行的函数,并且可以使用arguments.callee.length得到形参个数,其常见的用法是在匿名递归函数中调用匿名函数自身,如:
function fb(n) {
if (n <= 1) {
return 1;
} else {
return n * arguments.callee(n-1);
}
}
f(5); //120
f(0); //1
需要注意的是,ES5的严格模式下,已经禁用了arguments的callee,caller,以及参数绑定,仅可以使用length属性和索引,使用时应当特别留意。