浏览器在哪里存储用 let 或 const 定义的全局变量? [复制]
Posted
技术标签:
【中文标题】浏览器在哪里存储用 let 或 const 定义的全局变量? [复制]【英文标题】:Where does the browser store global variables defined with let or const? [duplicate] 【发布时间】:2017-11-06 22:35:37 【问题描述】:如果用 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
【问题讨论】:
用let
或const
声明的变量不是全局变量。它们在模块范围内声明。
它将它们存储在黄色便利贴上,贴在冰箱门上。
这有关系吗?我认为它们是故意不通过全局对象提供的。
【参考方案1】:
global environment record 由两部分组成
object environment record 和一个 declarative environment record环境记录是用于存储identifier name -> value
映射的概念数据结构。
您可能会怀疑,object 环境记录由实际的用户空间对象支持,例如全局对象或使用with
时的任意对象。这就是使全局绑定成为全局对象的属性的原因。
let
、const
和其他声明存储在 declarative 环境记录部分,该记录部分由一些实现特定的数据结构支持。您之前遇到过声明性环境,因为每个 function 环境都是声明性环境。所以也可以说 “let
和 const
存储在全局范围内,就像任何绑定存储在函数中一样”。
来自规范:
全局Environment Record 在逻辑上是单个记录,但它被指定为封装对象环境记录和声明性环境记录的组合。对象环境记录具有关联领域的全局对象作为其基础对象。这个全局对象是全局环境记录的 GetThisBinding 具体方法返回的值。全局环境记录的对象环境记录组件包含所有内置全局变量 (clause 18) 的绑定以及由 FunctionDeclaration、GeneratorDeclaration 或 引入的所有绑定em>VariableStatement 包含在全局代码中。全局代码中所有其他 ECMAScript 声明的绑定都包含在全局环境记录的声明性环境记录组件中。
【讨论】:
以上是关于浏览器在哪里存储用 let 或 const 定义的全局变量? [复制]的主要内容,如果未能解决你的问题,请参考以下文章