【问题标题】:Where are global let variables stored? [duplicate]全局 let 变量存储在哪里? [复制]
【发布时间】:2017-06-10 10:08:40
【问题描述】:

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

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

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

【问题讨论】:

  • Mozilla 像这样描述hereGlobal let ... live in the scope of an invisible block that notionally encloses all JS code that runs in a web page.

标签: javascript ecmascript-6 let


【解决方案1】:

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

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

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

它的全局方面在§8.2.3 - SetGlobalRealmObject 中定义,而§8.1.2.5 - NewGlobalEnvironment(G, thisValue) 又引用了§8.1.2.5 - NewGlobalEnvironment(G, thisValue)

【讨论】:

  • 有没有办法检查词法范围内的所有变量?像这样,我们可以console.log(window) 并查看所有关联的变量。
  • @GAkshay:不。这就是为什么它们被移出全局对象的部分原因,以使它们不可被发现。随着模块的添加,目标是不再使用全局对象。
  • (我早该知道这会被上一个问题的答案所涵盖。)
猜你喜欢
  • 2017-11-06
  • 1970-01-01
  • 2021-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多