PutValue(v,w)

2018-06-16 15:06 更新
  1. 如果 Type(V) 不是引用,拋出一個 ReferenceError 異常。
  2. 令 base 為調(diào)用 GetBase(V) 的結(jié)果。
  3. 如果 IsUnresolvableReference(V),那么如果 IsStrictReference(V) 是 true,那么拋出 ReferenceError 異常。用 GetReferencedName(V),W,false 作為參數(shù)調(diào)用全局對象的 [[Put]] 內(nèi)部方法。
  4. 否則如果 IsPropertyReference(V),那么如果 HasPrimitiveBase(V) 是 false,那么令 put 為 base 的 [[Put]] 內(nèi)部方法,否則令 put 為下面定義的特殊的 [[Put]] 內(nèi)部方法。用 base 作為 this 值,用 GetReferencedName(V),W,IsStrictReference(V) 作為參數(shù)調(diào)用 put 內(nèi)部方法。
  5. 否則 base 必定是 environment record 作為 base 的引用。所以,用 GetReferencedName(V), W, IsStrictReference(V) 作為參數(shù)調(diào)用 base 的 SetMutableBinding (10.2.1) 具體方法。
  6. 返回。

 PutValue 中的 V 是原始基值的屬性引用時使用下面的 [[Put]] 內(nèi)部方法。用 base 作為 this 值,用屬性 P,值 W,布爾標(biāo)志 Throw 作為參數(shù)調(diào)用它。采用以下步驟:

  1. 令 O 為 ToObject(base)。
  2. 如果用 P 作為參數(shù)調(diào)用 O 的 [[CanPut]] 內(nèi)部方法的結(jié)果是 false,那么如果 Throw 是 true,那么拋出一個 TypeError 異常。否則返回。
  3. 令 ownDesc 為用 P 作為參數(shù)調(diào)用 O 的 [[GetOwnProperty]] 內(nèi)部方法的結(jié)果。
  4. 如果 IsDataDescriptor(ownDesc) 是 true,那么如果 Throw 是 true,那么拋出一個 TypeError 異常。否則返回。
  5. 令 desc 為用 P 作為參數(shù)調(diào)用 O 的 [[GetProperty]] 內(nèi)部方法的結(jié)果。這可能是一個自身或繼承的訪問器屬性描述或是一個繼承的數(shù)據(jù)屬性描述。
  6. 如果 IsAccessorDescriptor(desc) 是 true,那么令 setter 為 desc.Set,他不能是 undefined。用 base 作為 this 值,用只由 W 組成的列表作為參數(shù)調(diào)用 setter 的 [[Call]] 內(nèi)部方法。
  7. 否則,這是要在臨時對象 O 上創(chuàng)建自身屬性的請求。如果 Throw 是 true,拋出一個 TypeErroe 異常。
  8. 返回。

 上述方法之外無法訪問在第一步創(chuàng)建的對象。實現(xiàn)可以選擇不真的創(chuàng)建這個臨時對象。使用這個內(nèi)部方法給實際屬性訪問產(chǎn)生可見影響的情況只有在調(diào)用訪問器函數(shù)時,或 Throw 未通過提前錯誤檢查。當(dāng) Throw 是 true,試圖在這個臨時對象上創(chuàng)建新屬性的任何屬性分配操作會拋出一個錯誤。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號