全局 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 let
、const
和 class
标识符绑定不再保存在全局对象中,而是保存在单独的声明性环境记录中。
环境记录和词法环境对象与(在 ES2015+ 和 ES5 及更早版本中)用于在函数内存储局部变量的机制相同。
全局方面在 §8.2.3 - SetGlobalRealmObject, which in turn references §8.1.2.5 - NewGlobalEnvironment(G, thisValue) 中定义。
我在全局范围内创建了一个导航器变量,并使用 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 let
、const
和 class
标识符绑定不再保存在全局对象中,而是保存在单独的声明性环境记录中。
环境记录和词法环境对象与(在 ES2015+ 和 ES5 及更早版本中)用于在函数内存储局部变量的机制相同。
全局方面在 §8.2.3 - SetGlobalRealmObject, which in turn references §8.1.2.5 - NewGlobalEnvironment(G, thisValue) 中定义。