让我们以下面的代码为例:
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'
})();
根据mdn对const
语句的描述:
此声明创建一个常量,该常量的范围对于声明它的块可以是全局的或局部的。
我假设let
的工作方式相同。
在这种情况下,“块”包含在全局范围内。我想这里的重要区别在于,尽管const constVar
是“全局”可访问的,但仍未在window
对象上定义它。
这使我认为全局范围和window
对象是完全不同的。最终导致2个问题。
为什么在var
上定义了使用window
关键字声明的变量,而在const
上定义了用let
和window
声明的变量?
“全局范围”和浏览器提供给我们的window
对象之间有什么区别。
答案 0 :(得分:4)
1。为什么在窗口上定义使用
var
关键字声明的变量,而在窗口上未定义用const
和let
声明的变量?
因为规范是这样说的。如果您要问这个决定背后的原因,那么您应该联系规范维护者。
无论如何,类也不会成为全局对象的属性。
2。 “全局范围”和浏览器提供给我们的
window
对象之间有什么区别。
根据规范,基础environment records有两种类型:
声明性环境记录基本上是您在调用函数时获得的标准环境。所有绑定(变量,常量等)都是在某些内部数据结构中定义的,这些结构无法从普通代码中访问。
对象环境记录则使用实际的JavaScript对象存储绑定。例如,现在已弃用的with
语句使用了此命令:
with({foo: 42}) {
console.log(foo);
}
现在,Global Environment Record实际上包含两个环境记录:声明性环境记录和对象环境记录。对象环境由全局对象(即window
)支持,并包含var
声明和浏览器提供的其他全局变量。声明性环境包含let
,const
,class
等声明。
答案 1 :(得分:0)
来自https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/const
此声明创建一个常量,该常量的范围对于声明它的块可以是全局的或局部的。 与var变量不同,全局常量不会成为窗口对象的属性。需要一个常量的初始化程序;也就是说,您必须在声明它的同一条语句中指定它的值(这很有意义,因为以后不能更改)。
要回答第二个问题,可以通过window对象访问全局变量。但是,const是个例外。