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

4

如果使用const或let定义的全局变量不会存储在window对象中,那它们被存储在哪里呢?

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

3
使用 letconst 声明的变量不是全局变量,它们是在模块范围内声明的。 - zerkms
4
它会把它们存储在黄色便签纸上,粘贴在冰箱门上。 - user663031
有关编程的内容翻译成中文:这重要吗?我认为它们故意没有通过全局对象提供。 - nnnnnn
1个回答

6

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

环境记录是概念上的数据结构,用于存储标识符名称 -> 值映射。

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

letconst和其他声明存储在支持某些实现特定数据结构的声明性环境记录部分中。您以前遇到过声明性环境,因为每个函数环境都是一个声明性环境。因此,可以说"letconst与任何绑定在函数中存储方式相同,在全局范围内存储"

根据规范:

一个全局环境记录在逻辑上是单个记录,但它被指定为一个复合封装了对象环境记录和声明性环境记录的记录。对象环境记录以其基础对象为相关领域的全局对象。该全局对象是全局环境记录的GetThisBinding具体方法返回的值。全局环境记录的对象环境记录组件包含所有内置全局变量(第18条)和由全局代码中的FunctionDeclarationGeneratorDeclarationVariableStatement引入的所有绑定。全局代码中所有其他ECMAScript声明的绑定都包含在全局环境记录的声明性环境记录组件中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接