论点和参考

Eri*_*ric 8 javascript

考虑这个JavaScript函数:

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

我希望a并且arguments[0]仅在函数的第二个语句之前引用相同的值.相反,它们似乎总是引用相同的值:f(2)原因

2 2
3 3
Run Code Online (Sandbox Code Playgroud)

f({foo: 'bar'})原因:

[object Object] [object Object]
3 3
Run Code Online (Sandbox Code Playgroud)

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

Fel*_*ing 7

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

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

从规范(ES6,ES5):

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