[英]How to comprehend clause 10.5 in ECMA-262 5.1 Edition?
最近,我讀到有關ES5規范的信息,在第10章中有一個關於執行上下文的困惑。 更確切地說,混淆存在於10.5 [ https://ecma-international.org/ecma-262/5.1/#sec-10.5 ]中。
第10.5條名為“聲明綁定實例化” ,它說明了如何生成執行上下文的 VariableEnvironment組件。 在項目5 iii中, Im感到困惑的是:“如果existProp。[[Configurable]]是true ...”。
這樣做的目的是什么, 為什么在調用全局對象的[[DefineOwnProperty]]時未定義PropertyDescriptor。[[Value]] ,以及如何使用真實的javascript代碼來證明這一步驟?
也許這是一個錯誤? 這里的[[Value]]應該是聲明的函數對象?
當在頂層聲明一個函數時,它首先檢查該屬性名是否存在於全局對象上。 如果該屬性不存在,則:
C。 令funcAlreadyDeclared為通過fn作為參數調用env的HasBinding具體方法的結果。
d。 如果funcAlreadyDeclared為false,則調用fn和configurableBindings作為參數,調用env的CreateMutableBinding具體方法。
否則,它將進入e.
您正在查看的部分:
即 否則,如果env是全局環境的環境記錄組件,則:...
因此,在該e.
任何位置e.
, funcAlreadyDeclared
必然是true
-屬性已經被定義,剩下的就是要檢查是否該屬性是可變的。 PropertyDescriptor.[[Value]]
將必須返回完整的屬性描述符,因為在e.
,我們知道該屬性確實存在; 該塊僅在funcAlreadyDeclared
為true
運行。
在頂層,它檢查屬性是否可配置,如果是,則在全局對象上設置關聯的屬性。 例如,頂層function foo(){}
將導致定義window.foo
,並且本節檢查是否可以定義window.foo
。
具有true
configurable
性意味着 :
當且僅當此屬性描述符的類型可以更改並且該屬性可以從相應對象中刪除時,才返回true。
例如, window.top
是不可配置的,因此[[DefineOwnProperty]]
將不會運行:
console.log(Object.getOwnPropertyDescriptor(window, 'top'));
因此,嘗試在top
聲明一個名為top
的函數將引發錯誤:
function top() { }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.