PutValue(v,w)

2018-06-16 15:06 更新
  1. 如果 Type(V) 不是引用,抛出一个 ReferenceError 异常。
  2. 令 base 为调用 GetBase(V) 的结果。
  3. 如果 IsUnresolvableReference(V),那么如果 IsStrictReference(V) 是 true,那么抛出 ReferenceError 异常。用 GetReferencedName(V),W,false 作为参数调用全局对象的 [[Put]] 内部方法。
  4. 否则如果 IsPropertyReference(V),那么如果 HasPrimitiveBase(V) 是 false,那么令 put 为 base 的 [[Put]] 内部方法,否则令 put 为下面定义的特殊的 [[Put]] 内部方法。用 base 作为 this 值,用 GetReferencedName(V),W,IsStrictReference(V) 作为参数调用 put 内部方法。
  5. 否则 base 必定是 environment record 作为 base 的引用。所以,用 GetReferencedName(V), W, IsStrictReference(V) 作为参数调用 base 的 SetMutableBinding (10.2.1) 具体方法。
  6. 返回。

 PutValue 中的 V 是原始基值的属性引用时使用下面的 [[Put]] 内部方法。用 base 作为 this 值,用属性 P,值 W,布尔标志 Throw 作为参数调用它。采用以下步骤:

  1. 令 O 为 ToObject(base)。
  2. 如果用 P 作为参数调用 O 的 [[CanPut]] 内部方法的结果是 false,那么如果 Throw 是 true,那么抛出一个 TypeError 异常。否则返回。
  3. 令 ownDesc 为用 P 作为参数调用 O 的 [[GetOwnProperty]] 内部方法的结果。
  4. 如果 IsDataDescriptor(ownDesc) 是 true,那么如果 Throw 是 true,那么抛出一个 TypeError 异常。否则返回。
  5. 令 desc 为用 P 作为参数调用 O 的 [[GetProperty]] 内部方法的结果。这可能是一个自身或继承的访问器属性描述或是一个继承的数据属性描述。
  6. 如果 IsAccessorDescriptor(desc) 是 true,那么令 setter 为 desc.Set,他不能是 undefined。用 base 作为 this 值,用只由 W 组成的列表作为参数调用 setter 的 [[Call]] 内部方法。
  7. 否则,这是要在临时对象 O 上创建自身属性的请求。如果 Throw 是 true,抛出一个 TypeErroe 异常。
  8. 返回。

 上述方法之外无法访问在第一步创建的对象。实现可以选择不真的创建这个临时对象。使用这个内部方法给实际属性访问产生可见影响的情况只有在调用访问器函数时,或 Throw 未通过提前错误检查。当 Throw 是 true,试图在这个临时对象上创建新属性的任何属性分配操作会抛出一个错误。


以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号