2017-06-06 173 views
3

如果使用const或let定义的全局变量未存储在窗口上,它们在哪里存储?浏览器在哪里存储用let或const定义的全局变量?

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

用'let'或'const'声明的变量不是全局变量。它们在模块范围内声明。 – zerkms

+4

它将它们存放在黄色柱子上,它卡在冰箱门上。 – 2017-06-06 03:42:37

+0

重要吗?我认为他们故意不通过全球对象提供。 – nnnnnn

回答

4

global environment record由两个部分组成

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

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

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

从规格:

全局Environment Record在逻辑上是单个记录,但它被指定为一个复合封装的对象环境记录和声明性环境记录。对象环境记录具有相关领域的全局对象作为其基础对象。这个全局对象是全局环境记录的GetThisBinding具体方法返回的值。全球环境记录的对象环境记录组件包含绑定所有内置全局(clause 18),并通过FunctionDeclarationGeneratorDeclaration,或包含在全局代码VariableStatement引入的所有绑定。全局代码中所有其他ECMAScript声明的绑定都包含在全局环境记录的声明式环境记录组件中。