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

时间:2017-06-06 03:41:05

标签: 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

1 个答案:

答案 0 :(得分:5)

global environment record由两部分组成

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

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

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

来自规范:

  

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