javascript - 为什么不在窗口对象上定义 const 和 let 语句
问题描述
我们以下面的代码为例:
const constVar = 'some string';
let letVar = 'some string';
var varVar = 'some string';
(function() {
console.log(window.constVar); // prints undefined
console.log(window.letVar); // prints undefined
console.log(window.varVar); // prints 'some string'
})();
根据const
mdn声明的描述:
这个声明创建了一个常量,它的范围可以是全局的,也可以是声明它的块的局部。
我假设let
以同样的方式工作。
在这种情况下,“块”包含在全局范围内。我想这里的重要区别是虽然const constVar
可以“全局”访问它,但它仍然没有在window
对象上定义它。
这使我认为全局范围和window
对象是完全不同的。这最终导致了2个问题。
为什么使用
var
关键字声明的变量被定义在window
和声明的变量const
和let
未定义的window
?window
“全局范围”和浏览器提供给我们的对象有什么区别。
解决方案
1.为什么用
var
关键字声明的变量在window上定义,而在window上声明的变量const
和let
未定义的变量?
因为规范是这么说的。如果您询问该决定背后的原因,那么您应该联系规范维护者。
顺便说一句,类也不会成为全局对象的属性。
window
2、“全局作用域”与浏览器提供给我们的对象有什么区别。
根据规范,有两种类型的基本环境记录:
- 声明性环境记录
- 对象环境记录
声明性环境记录基本上是您在调用函数时获得的标准环境。所有绑定(变量、常量等)都定义在一些无法从普通代码访问的内部数据结构中。
另一方面,对象环境记录使用实际的 JavaScript 对象来存储绑定。例如,现在已弃用的with
语句就使用了它:
with({foo: 42}) {
console.log(foo);
}
现在,一个全局环境记录实际上由两个环境记录组成:一个声明性环境记录和一个对象环境记录。对象环境由全局对象支持,即window
包含var
浏览器提供的声明和其他全局变量。声明性环境包含let
, const
,class
等声明。
推荐阅读
- java - 让 Eclipse RCP Mac 应用程序显示闪屏
- sql - 如何使用 SQL 获取日期的最后 2 周
- oauth-2.0 - 是否有基于 OIDC 的基于 IDaaS 的社交登录的标准模式?
- android - Android jet pack架构组件导航在java中不起作用?
- java - 如何检测 websocket 频道是否没有订阅者
- azure-notificationhub - 通过 Azure 门户将 Azure 推送通知发送到生产应用程序
- c++ - 正则表达式 - 删除一行(英文)并将其附加到上线的末尾(韩文)
- angular - 正确使用 RxJS 的方法
- azure-digital-twins - 如何将 Sensor 遥测数据持久化到大数据存储或 cosmosdb 等冷存储中
- jquery - Javascript:如何传入不带引号的标头令牌?