论点和参考

时间:2015-03-02 16:43:22

标签: javascript

考虑这个JavaScript函数:

var f = function (a) {
  console.log(a+" "+arguments[0]);
  a = 3;
  console.log(a+" "+arguments[0]);
}

我希望aarguments[0]仅在函数的第二个语句中引用相同的值。相反,他们似乎总是引用相同的值:f(2)导致

2 2
3 3

f({foo: 'bar'})导致:

[object Object] [object Object]
3 3

参数标识符和arguments标识符是否以特殊方式链接?

1 个答案:

答案 0 :(得分:7)

  

参数标识符和参数标识符是否以特殊方式链接?

是(但仅限于非严格模式)。

从规范(ES6ES5):

  

对于非严格模式函数,arguments对象的整数索引数据属性(其数字名称值小于相应函数对象的形式参数的数量)最初与其中的相应参数绑定共享其值。函数execution context这意味着更改属性会更改参数绑定的相应值,反之亦然。如果删除并重新定义此属性或将属性更改为访问者属性,则此对应关系将被破坏。对于严格模式函数,arguments对象的属性值只是传递给函数的参数的副本,并且属性值和形式参数值之间没有动态链接。