全局let变量存储在哪里?

时间:2017-01-25 09:35:45

标签: javascript ecmascript-6 let

我在全局范围内创建了一个导航器变量,并使用let关键字为其分配了一个字符串。

// in a browser
    let navigator = "Hello!";
    console.log(navigator );                       // "Hello!"
    console.log(window.navigator === navigator );  // false

此处let navigator值会影响window.navigator。但我很想知道let navigator到底存储在哪里?

1 个答案:

答案 0 :(得分:6)

由于您使用的是let而不是var,因此它会存储在与全局environment record关联的声明式lexical environment object中,而不是存储在全局对象本身中。环境记录和词汇环境对象是规范机制,不能直接在代码中访问(因此它们的实际实现可能因JavaScript引擎而异)。

这是一个概念 - 不是全局对象属性的全局变量 - 是从ES2015开始引入的新东西;在此之前,所有全局变量都是全局对象的属性。自ES2015起,全局级letconstclass标识符绑定不会保留在全局对象上,而是保存在单独的声明性环境记录中。

环境记录和词汇环境对象与在ES2015 +和ES5及更早版本中使用的机制相同,用于在函数中存储局部变量。

此问题的全局方面在§8.2.3 - SetGlobalRealmObject中定义,后者又引用§8.1.2.5 - NewGlobalEnvironment(G, thisValue)