考虑这个JavaScript函数:
var f = function (a) {
console.log(a+" "+arguments[0]);
a = 3;
console.log(a+" "+arguments[0]);
}
我希望a
和arguments[0]
仅在函数的第二个语句中引用相同的值。相反,他们似乎总是引用相同的值:f(2)
导致
2 2
3 3
和f({foo: 'bar'})
导致:
[object Object] [object Object]
3 3
参数标识符和arguments
标识符是否以特殊方式链接?
答案 0 :(得分:7)
参数标识符和参数标识符是否以特殊方式链接?
是(但仅限于非严格模式)。
对于非严格模式函数,
arguments
对象的整数索引数据属性(其数字名称值小于相应函数对象的形式参数的数量)最初与其中的相应参数绑定共享其值。函数execution context。 这意味着更改属性会更改参数绑定的相应值,反之亦然。如果删除并重新定义此属性或将属性更改为访问者属性,则此对应关系将被破坏。对于严格模式函数,arguments对象的属性值只是传递给函数的参数的副本,并且属性值和形式参数值之间没有动态链接。