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