首页 > 解决方案 > 为什么不在窗口对象上定义 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'
})();

根据constmdn声明的描述:

这个声明创建了一个常量,它的范围可以是全局的,也可以是声明它的块的局部。

我假设let以同样的方式工作。

在这种情况下,“块”包含在全局范围内。我想这里的重要区别是虽然const constVar可以“全局”访问它,但它仍然没有在window对象上定义它。

这使我认为全局范围和window对象是完全不同的。这最终导致了2个问题。

  1. 为什么使用var关键字声明的变量被定义在window和声明的变量constlet未定义的window

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

标签: javascript

解决方案


1.为什么用var关键字声明的变量在window上定义,而在window上声明的变量constlet未定义的变量?

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

顺便说一句,类也不会成为全局对象的属性。

window2、“全局作用域”与浏览器提供给我们的对象有什么区别。

根据规范,有两种类型的基本环境记录:

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

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

另一方面,对象环境记录使用实际的 JavaScript 对象来存储绑定例如,现在已弃用的with语句就使用了它:

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

现在,一个全局环境记录实际上由两个环境记录组成:一个声明性环境记录和一个对象环境记录。对象环境由全局对象支持,即window包含var浏览器提供的声明和其他全局变量。声明性环境包含let, const,class等声明。


推荐阅读