浏览器在哪里存储用 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

【问题讨论】:

letconst 声明的变量不是全局变量。它们在模块范围内声明。 它将它们存储在黄色便利贴上,贴在冰箱门上。 这有关系吗?我认为它们是故意不通过全局对象提供的。 【参考方案1】:

global environment record 由两部分组成

object environment record 和一个 declarative environment record

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

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

letconst 和其他声明存储在 declarative 环境记录部分,该记录部分由一些实现特定的数据结构支持。您之前遇到过声明性环境,因为每个 function 环境都是声明性环境。所以也可以说 letconst 存储在全局范围内,就像任何绑定存储在函数中一样”

来自规范:

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

【讨论】:

以上是关于浏览器在哪里存储用 let 或 const 定义的全局变量? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

const,var,let笔记

关于变量声明的var,let,const

ECMAScript 6中let和const详解

ES6新增语法

let和const在es6中的异同点

let & const