2017-06-06 177 views
3

如果使用const或let定義的全局變量未存儲在窗口上,它們在哪裏存儲?瀏覽器在哪裏存儲用let或const定義的全局變量?

var varTest = 'var test'; 
const constTest = 'const test'; 
let letTest = 'let test'; 

varTest   //"var test" 
letTest   //"let test" 
constTest   //"const test" 
window.varTest  //"var test" 
window.constTest //undefined 
window.letTest  //undefined 
+3

用'let'或'const'聲明的變量不是全局變量。它們在模塊範圍內聲明。 – zerkms

+4

它將它們存放在黃色柱子上,它卡在冰箱門上。 – 2017-06-06 03:42:37

+0

重要嗎?我認爲他們故意不通過全球對象提供。 – nnnnnn

回答

4

global environment record由兩個部分組成

環境記錄是用於存儲identifier name -> value映射概念性的數據結構。

正如您可能懷疑的那樣,對象當您使用with時,環境記錄由實際用戶空間對象(例如全局對象或任意對象)支持。這就是全局綁定成爲全局對象的屬性的原因。

letconst和其他聲明是其中一些實施的具體數據結構支持的聲明環境記錄的一部分存儲。您之前遇到過聲明式環境,因爲每個函數環境都是聲明性環境。因此,人們也可以說letconst以與任何綁定存儲在函數」「中相同的方式存儲在全局範圍中。

從規格:

全局Environment Record在邏輯上是單個記錄,但它被指定爲一個複合封裝的對象環境記錄和聲明性環境記錄。對象環境記錄具有相關領域的全局對象作爲其基礎對象。這個全局對象是全局環境記錄的GetThisBinding具體方法返回的值。全球環境記錄的對象環境記錄組件包含綁定所有內置全局(clause 18),並通過FunctionDeclarationGeneratorDeclaration,或包含在全局代碼VariableStatement引入的所有綁定。全局代碼中所有其他ECMAScript聲明的綁定都包含在全局環境記錄的聲明式環境記錄組件中。