为什么不能在函数内通过给arguments对象添加数组传递参数?

function sum(a1,a2)
{
    arguments = [5,6];
    var x = a1+a2;
    alert(x);
}
sum();

参数不是以数组存储在arguments对象中吗?
为甚么弹出NaN?

阅读 3.6k
3 个回答

是,你是重新赋值了arguments,但是a1和a2的值不会从arguments自动赋值过去的,a1和a2的值获取还是在你调用sum()的时候获取的,你没传参,自然是NaN,所以这里,arguments确实是有数据的,5和6,你赋值的,a1和a2是没有数据的

因为比如

var a1 = undefined, a2 = undefined;
var arguments = [a1, a2];
arguments = [3, 4];

这个时候a1,a2仍然是undefined,undefined + undefined == NaN

首先要注意的是:
javascript函数体内,arguments像数组(并不是真的数组,是一个Arguments对象,再次强调)一样,有length属性,可以代表传给函数的参数的个数。
javascript中Arguments对象是函数的实际参数,arguments对象的长度是由实参个数而不是形参个数决定的。形参是函数内部重新开辟内存空间存储的变量,但是其与arguments对象内存空间并不重叠。
另外:
在es5规范下的非严格模式下,你的代码是可行的。即可以这样修改。
es5规范的严格模式下,效果等同你现在的效果。
但自es6之后,非严格模式下效果也如同你现在的效果一样,即arguments和参数符号分别存放。
而es6的严格模式下,修改arguments会报错。

Uncaught SyntaxError: Unexpected eval or arguments in strict mode

所以,熟读es规范很有必要啊。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏