全局声明的const为何无法通过globalThis/window访问?存储位置是什么?
全局const/let声明的访问与存储机制
1. 是否可以通过globalThis/window访问全局声明的const常量?
没有标准方法可以直接做到。
ES6规范对全局声明做了明确拆分:
- ES5中就存在的
var全局声明、全局函数声明、隐式全局赋值(无关键字直接赋值),都会被挂载为globalThis的可枚举属性,所以可以通过属性访问的方式拿到。 - ES6新增的
const、let、class的全局声明,属于全局词法声明,不会被挂载到globalThis上,自然也没法通过globalThis.xxx的方式访问,除非你手动显式挂载:globalThis.ccc = ccc。
2. 这类全局const常量的实际存储位置是什么?
这类全局词法声明的变量/常量,存储在JS引擎维护的全局词法环境的环境记录项中,这是引擎内部的作用域管理结构,不会暴露给开发者做直接的属性式访问,你只能在全局作用域范围内通过变量名直接引用对应值。
你给出的测试代码输出完全符合上述规范要求:
aaa = "aaa"; // 隐式挂载为globalThis.aaa var bbb = "bbb"; // var全局声明自动挂载为globalThis.bbb const ccc = "ccc"; // 存储在全局词法环境,和globalThis无关 console.log(globalThis.aaa, globalThis.bbb, globalThis.ccc); // 输出 aaa bbb undefined
内容的提问来源于stack exchange,提问作者wanderingStranger
相关产品推荐
相关产品推荐

