浏览器在哪里存储用let或const定义的全局变量?

Con*_*atz 3 javascript ecmascript-6

如果用const或let定义的全局变量没有存储在窗口中,它们存储在哪里?

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
Run Code Online (Sandbox Code Playgroud)

Fel*_*ing 5

一个全球环境记录由两个部分组成

环境记录是用于存储identifier name -> value映射的概念数据结构.

您可能怀疑,对象环境记录由实际用户空间对象支持,例如全局对象或使用时的任意对象with.这就是使全局绑定成为全局对象属性的原因.

let,const以及其他声明都是在店里声明这是由一些执行特定的数据结构支持的环境记录的一部分.您之前遇到过声明性环境,因为每个函数环境都是声明性环境.因此,人们也可以说" let并且const存储在全局范围中的方式与任何绑定存储在函数中的方式相同".

从规格:

全局环境记录在逻辑上是单个记录,但它被指定为封装对象环境记录和声明性环境记录的组合.对象环境记录将关联领域的全局对象作为其基础对象.此全局对象是全局环境记录的GetThisBinding具体方法返回的值.全局环境记录的对象Environment Record组件包含所有内置全局变量(第18节)的绑定以及全局代码中包含的FunctionDeclaration,GeneratorDeclarationVariableStatement引入的所有绑定.全局代码中所有其他ECMAScript声明的绑定包含在全局环境记录的声明性环境记录组件中.