参数对象未显示正确的结果

时间:2016-01-27 03:25:43

标签: javascript

看看这段代码

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; 我很困惑..请帮忙。感谢。

3 个答案:

答案 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]