2016-11-11 23 views
5

ES5將variable object(VO)更改爲詞彙環境。由於VO作爲知覺已經非常明顯,這種變化的動機是什麼?爲什麼變量對象在ES5中改變爲詞法環境?

+1

我不明白這個問題嗎? 「變量對象」是什麼意思?你能否參考你所說的規格改變? – nils

+0

@nils添加了一個鏈接。 – Thomson

+2

@MadaraUchiha有趣的是,ES3規範確實使用了術語「可變對象」:http://www.ecma-international.org/publications/files/ECMA-ST-ARCH/ECMA-262,%203rd%20edition,% 20十二月%201999.pdf(10.1.3節) – nils

回答

2

我認爲變量對象更類似於environment records

環境記錄記錄了在其關聯的詞法環境範圍內創建的標識符綁定 。

在ES5有兩種不同類型的環境記錄:

聲明環境記錄用於定義 ECMAScript語言語法元素的效果如FunctionDeclarationsVariableDeclarations,和Catch子句直接將標識符綁定與ECMAScript語言值相關聯。對象 環境記錄用於定義作爲方案WithStatement與某些對象的屬性 標識符綁定關聯這樣 元件的ECMAScript的效果。

所以問題是爲什麼聲明性環境記錄被引入而不是像ES3變量對象那樣只使用對象環境記錄。不同的是,declarative environment records可以有永恆不變的綁定:

除了所有環境 支持的可變綁定記錄,聲明環境記錄也爲一成不變 綁定。一個 標識符與值之間的關聯一旦建立了 就不可能被修改。

不可變綁定在對象中沒有直接的等價物。一個屬性可以被定義爲不可配置和不可寫,從而變得不可變。然而,

創建和不可改變的結合是不同的步驟初始化所以 可能的是在任一種初始化或 未初始化狀態存在這樣的綁定。

但是你不能有一個未初始化的屬性。如果您定義了一個值爲undefined的不可配置的非可寫屬性,那麼您將無法將其初始化爲期望的值。

我不認爲有可能在ES5中有未初始化的不可變綁定。 CreateImmutableBinding僅用於Declaration Binding InstantiationFunction Definition,並且在兩種情況下都立即使用InitializeImmutableBinding進行初始化。

但可能這樣做是爲了允許未初始化的不可變綁定作爲語言的擴展,如JavaScript 1.5 const。或者,也許他們已經記住ES6 const

1

您鏈接的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,而不是一個功能」

我不認爲我可以表達這個更好。

+0

我也想過這樣的事情。但即使規範使用了對象,如果可觀察行爲是相同的,實現將被允許使用他們想要的任何基礎數據結構,不是嗎? – Oriol

+0

@Oriol是的,我想他們可以,但它並不適合,因爲記錄具有靜態形狀(這是最重要的差異)。然後是你在答案中提到的創建與初始化,以及查找/分配工作完全不同(原型與範圍鏈)。 – Bergi

相關問題