看看这段代码
enter code here
function foo(a, b) {
arguments[1] = 2;
alert(b);
}
console.log(foo(1));
它显示undefined
我无法理解为什么..
因为当我们通过争论时
foo(1) `arguments[0]=1` right.?
当我们alert(b)
时,它应显示2,因为我们设置了arguments[1] = 2
;
我很困惑..请帮忙。感谢。
答案 0 :(得分:0)
只有在调用函数时存在的原始参数是"别名"通过arguments
对象,以便您可以更改arguments对象并使其自动影响命名函数参数。
仅供参考,在严格模式下,arguments
对象上的所有项都没有别名返回到命名函数参数。但是,在非严格模式下,最初存在的参数(以及仅存在的参数)通过arguments
对象返回别名。
请记住,arguments对象不是真正的Array。它是一种特殊类型的对象,这种特殊的#34;别名"行为仅存在于调用函数时最初放置在那里的对象的属性,而不是您自己可能已添加的属性。由于arguments[1]
最初不存在,因此它没有此特殊功能。
见:
function foo(a, b) {
console.log(arguments.length); // 1
arguments[1] = 2;
console.log(arguments.length); // still 1
console.log(arguments[1]); // does show 2
console.log(b); // undefined, arguments[1] is not aliased to b
}
console.log(foo(1));
答案 1 :(得分:0)
手动将元素添加到arguments
中不会正确设置setter和getter。甚至.length
都不会更新。
function foo(a, b){
arguments[1] = 2;
console.log(arguments.length); //1
}
foo(1);
摘要:不要向arguments
添加元素。请记住,arguments
不是数组。
答案 2 :(得分:0)
b
仍然undefined
是有意义的。当您运行foo(1)
时,它会将a
初始化为1
,将b
初始化为undefined
。修改arguments
对象不会改变它。也就是说,b
不是绑定到arguments[1]
。