ES5將variable object(VO)更改爲詞彙環境。由於VO作爲知覺已經非常明顯,這種變化的動機是什麼?爲什麼變量對象在ES5中改變爲詞法環境?
回答
我認爲變量對象更類似於environment records。
環境記錄記錄了在其關聯的詞法環境範圍內創建的標識符綁定 。
在ES5有兩種不同類型的環境記錄:
聲明環境記錄用於定義 ECMAScript語言語法元素的效果如FunctionDeclarations, VariableDeclarations,和Catch子句直接將標識符綁定與ECMAScript語言值相關聯。對象 環境記錄用於定義作爲方案和WithStatement與某些對象的屬性 標識符綁定關聯這樣 元件的ECMAScript的效果。
所以問題是爲什麼聲明性環境記錄被引入而不是像ES3變量對象那樣只使用對象環境記錄。不同的是,declarative environment records可以有永恆不變的綁定:
除了所有環境 支持的可變綁定記錄,聲明環境記錄也爲一成不變 綁定。一個 標識符與值之間的關聯一旦建立了 就不可能被修改。
不可變綁定在對象中沒有直接的等價物。一個屬性可以被定義爲不可配置和不可寫,從而變得不可變。然而,
創建和不可改變的結合是不同的步驟初始化所以 可能的是在任一種初始化或 未初始化狀態存在這樣的綁定。
但是你不能有一個未初始化的屬性。如果您定義了一個值爲undefined的不可配置的非可寫屬性,那麼您將無法將其初始化爲期望的值。
我不認爲有可能在ES5中有未初始化的不可變綁定。 CreateImmutableBinding僅用於Declaration Binding Instantiation和Function Definition,並且在兩種情況下都立即使用InitializeImmutableBinding進行初始化。
但可能這樣做是爲了允許未初始化的不可變綁定作爲語言的擴展,如JavaScript 1.5 const
。或者,也許他們已經記住ES6 const
。
您鏈接的ES3文章中也寫過關於ES5的作者(甚至將其鏈接到該部分)。我會從他的"Declarative environment record" section in ECMA-262-5 in detail. Chapter 3.2. Lexical environments: ECMAScript implementation引述Soshnikov先生:
在一般的情況下被假定的聲明記錄綁定直接在執行的較低水平,因此存儲(例如,在虛擬機中的寄存器,從而提供快速訪問)。這是與ES3中使用的舊的激活對象概念的主要區別。
即,沒有按規範’噸需要(甚至沒有按間接’噸建議)來實現聲明性記錄爲簡單對象其是低效在這種情況下。這個事實的結果是,聲明性環境記錄不被假定爲直接暴露給用戶級別,這意味着我們不能像這樣訪問這些綁定。記錄的屬性。事實上,我們無法’噸之前還,甚至在ES3 —有激活對象也是直接人跡罕至用戶(除儘管犀牛實現其仍然通過
__parent__
屬性暴露它)。潛在的,聲明記錄允許使用完整lexical addressing技術,就是讓沒有任何作用域鏈的查找—無論嵌套範圍的深度直接獲得所需要的變量(如果存儲是固定的,不變的,所有的變量地址甚至可以在編譯時知道)。但是,ES5規格並不直接提及這個事實。
所以再次,這是我們應該明白爲什麼它需要與聲明環境記錄更換舊激活對象概念更主要的是第一實施的所有效率。
因此,布蘭登·艾克也mentioned(最後一段)—在ES3激活對象實現只是「錯誤」:「我會注意,在ES5一些真正的改善,特別是第10章其現在使用聲明式綁定環境。 ES1-3 ’濫用物體作爲示波器(1995年,JS中這樣做也是我的錯誤,節省了執行該語言所需的物體)是一個bug,而不是一個功能」。
我不認爲我可以表達這個更好。
- 1. 爲什麼環境變量不變?
- 2. 爲什麼環境變量沒有在循環中更新?
- 3. 爲什麼環境變量無法在單個命令傳遞
- 4. 改變JDK - 環境變量
- 5. 變量/詞彙環境
- 6. 爲什麼「未設置」對環境變量有效?
- 7. 爲什麼在腳本中設置環境變量?
- 8. 爲什麼環境變量不能在$(shell)命令中工作?
- 9. 爲什麼不在腳本中更新環境變量
- 10. 爲什麼__block變量不被保留(在非ARC環境中)?
- 11. mod_auth_mellon環境變量爲空
- 12. Linux環境變量行爲
- 13. 爲什麼Javascript對象沒有改變?
- 14. 爲什麼不增加對象變量?
- 15. 爲什麼我的平臺環境變量定義爲'BNB'?
- 16. 爲什麼我的循環中沒有改變我的變量?
- 17. 得到改變環境變量在Python
- 18. 爲什麼變量沒有改變,對象是在函數中賦值後?
- 19. Powershell檢查什麼環境變量已經改變
- 20. 爲什麼python大寫windows中的所有環境變量
- 21. 爲什麼cmd和Console2中的環境變量不同?
- 22. 爲什麼Perforce不能在Linux上設置環境變量?
- 23. 爲什麼在已定義的環境變量上需要putenv()?
- 24. 爲什麼不改變colonySize變量?
- 25. VB:對象變量或塊變量未設置 - 爲什麼?
- 26. 爲什麼對象嵌套數組中的變量不變?
- 27. IPython - 更改環境變量
- 28. 爲什麼只需要在環境變量中爲JDK設置路徑和CLASSPATH?
- 29. 在UNIX中更改環境變量
- 30. 使用NumberFormat時,語言環境無法解析爲變量爲什麼?
我不明白這個問題嗎? 「變量對象」是什麼意思?你能否參考你所說的規格改變? – nils
@nils添加了一個鏈接。 – Thomson
@MadaraUchiha有趣的是,ES3規範確實使用了術語「可變對象」:http://www.ecma-international.org/publications/files/ECMA-ST-ARCH/ECMA-262,%203rd%20edition,% 20十二月%201999.pdf(10.1.3節) – nils