如果用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
答案 0 :(得分:5)
global environment record由两部分组成
环境记录是用于存储identifier name -> value
映射的概念数据结构。
您可能怀疑, object 环境记录由实际用户空间对象支持,例如全局对象或使用with
时的任意对象。这就是全局绑定成为全局对象属性的原因。
let
,const
和其他声明存储在声明性环境记录部分中,该部分由某些特定于实现的数据结构支持。您之前遇到过声明性环境,因为每个 function 环境都是声明性环境。所以也可以说" let
和const
存储在全局范围中的方式与任何绑定存储在函数中的方式相同" 。
来自规范:
全局Environment Record在逻辑上是单个记录,但它被指定为封装对象环境记录和声明性环境记录的组合。对象环境记录将关联领域的全局对象作为其基础对象。此全局对象是全局环境记录的GetThisBinding具体方法返回的值。全局环境记录的对象Environment Record组件包含所有内置全局变量(clause 18)的绑定以及 FunctionDeclaration , GeneratorDeclaration 引入的所有绑定,或全局代码中包含的 VariableStatement 。全局代码中所有其他ECMAScript声明的绑定包含在全局环境记录的声明性环境记录组件中。