为什么不const和let语句在window对象上定义

时间:2019-03-06 19:08:37

标签: javascript

让我们以下面的代码为例:

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个问题。

  1. 为什么在var上定义了使用window关键字声明的变量,而在const上定义了用letwindow声明的变量?

  2. “全局范围”和浏览器提供给我们的window对象之间有什么区别。

2 个答案:

答案 0 :(得分:4)

  

1。为什么在窗口上定义使用var关键字声明的变量,而在窗口上未定义用constlet声明的变量?

因为规范是这样说的。如果您要问这个决定背后的原因,那么您应该联系规范维护者。

无论如何,类也不会成为全局对象的属性。

  

2。 “全局范围”和浏览器提供给我们的window对象之间有什么区别。

根据规范,基础environment records有两种类型:

  • 声明性环境记录
  • 对象环境记录

声明性环境记录基本上是您在调用函数时获得的标准环境。所有绑定(变量,常量等)都是在某些内部数据结构中定义的,这些结构无法从普通代码中访问。

对象环境记录则使用实际的JavaScript对象存储绑定。例如,现在已弃用的with语句使用了此命令:

with({foo: 42}) {
  console.log(foo);
}

现在,Global Environment Record实际上包含两个环境记录:声明性环境记录和对象环境记录。对象环境由全局对象(即window)支持,并包含var声明和浏览器提供的其他全局变量。声明性环境包含letconstclass等声明。

答案 1 :(得分:0)

来自https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/const

  

此声明创建一个常量,该常量的范围对于声明它的块可以是全局的或局部的。   与var变量不同,全局常量不会成为窗口对象的属性。需要一个常量的初始化程序;也就是说,您必须在声明它的同一条语句中指定它的值(这很有意义,因为以后不能更改)。

要回答第二个问题,可以通过window对象访问全局变量。但是,const是个例外。