全局 let 变量存储在哪里?

Where are global let variables stored?

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

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

此处 let navigator 值隐藏 window.navigator。但是我很好奇想知道 let navigator 到底存储在哪里?

因为您使用了 let 而不是 var,所以它存储在声明 environment record associated with the global lexical environment object 中,而不是全局对象本身。环境记录和词法环境对象是规范机制,不能直接在代码中访问(因此它们的实际实现可能因 JavaScript 引擎而异)。

这是一个概念——不是全局对象属性的全局变量——是 ES2015 引入的新事物;在那之前,所有全局变量都是全局对象的属性。从 ES2015 开始,global-level letconstclass 标识符绑定不再保存在全局对象中,而是保存在单独的声明性环境记录中。

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

全局方面在 §8.2.3 - SetGlobalRealmObject, which in turn references §8.1.2.5 - NewGlobalEnvironment(G, thisValue) 中定义。