2013-05-06 68 views

回答

14

实际上,在严格模式下,不是发生为you can see here

如果读取的ECMA Standard的部分10.6,特别是注1,你会看到:

对于非严格模式函数数组指数(在15.4中定义)的参数指定的数据属性对象 其数值名称值小于最初的对应函数对象的形式参数数 与函数的执行上下文中的相应参数绑定共享它们的值。这意味着更改 该属性将更改参数绑定的相应值,反之亦然。如果 这样的属性被删除,然后重新定义或者如果属性更改为访问器属性,则该对应关系被破坏。对于严格模式 函数,参数对象的属性值只是传递给函数的参数的副本,并且在属性值和形式参数值之间不存在动态链接。

总之,这是什么想说的是,在非严格模式,命名函数参数的别名在arguments对象的项目进行操作。因此,改变一个命名参数的值将会改变等价物的值,反之亦然。这不是一个错误。这是预期的行为。

作为一篇社论,依靠这种行为可能不是一个好主意,因为它会导致一些非常混乱的代码。而且,这些代码如果在严格模式下执行,则不再有效。

+1

对downvote的原因感到好奇 - 希望在可能的情况下改进答案。 – Dancrumb 2013-05-07 14:11:20

8

改变x反映在arguments[0]由于arguments索引可以是吸气/ setter方法用于匹配命名参数。这是step 11.c.ii of 10.6下定义:

  1. 添加作为列表mappedNames的元素。

  2. 是调用带有参数ENVMakeArgGetter抽象操作的结果。

  3. p是调用带有参数ENVMakeArgSetter抽象操作的结果。

  4. 呼叫地图的[[DefineOwnProperty]]内部方法通过ToString(INDX),则Property Descriptor {[[设置]]:p,[[获取]]:,[[配置]] :true}和false作为参数。

如在上面的步骤指出的,这要求严格和,在这种情况下,f是带一个值x

f() // undefined, undefined (no argument, no getter/setter) 
f(1) // 1, 42 
相关问题