所有非箭头函数都有arguments这个局部变量。arguments有长度、索引元素,但没有其他Aarray有的属性,是类数组对象。
arguments拥有属性callee,callee为arguments所在的函数。
转换为数组
将arguments转换成数组是常见的操作。
-
Array.prototype.slice.call(arguments) / [].slice.call(arguments)
ps. slice会阻止某些js引擎优化(详情见mdn) -
Array.from(arguments) ES2015新增方法
-
[...arguments] ES2015新增展开操作符
-
遍历arguments创建新数组
-
Array.apply(null, arguments) 利用Array构造函数
实参与arguments
在非严格模式下,有传入的实参与arguments绑定,例如:
test(1);
function test(x, y){
x = 2;
console.log(x, arguments[0]); //2 , 2
y = 3;
console.log(y, arguments[1]); //3 , undefined
}
而严格模式下,实参与arguments则没有这样的表现。
所以在非严格模式下,arguments与对应的实参应该是共享内存地址的。
leaking arguments
arguments不应该传递到函数外,泄漏可能会影响js引擎的优化。例如:
function leak1(){
return arguments;
}
function leak2(){
var args = [].slice.call(arguments);
}
function leak3(){
var a = arguments;
return function(){
return a;
}
}
网友评论