一个javascript'让'全局变量不是“窗口”的属性。不像全球' var'

时间:2016-09-09 15:10:39

标签: javascript var let

我曾经检查过全局var是否定义为:

if (window['myvar']==null) ...

if (window.myvar==null) ...

适用于var myvar

现在我正在尝试切换到let,这不再起作用了。

var myvar='a';
console.log(window.myvar); // gives me a
let mylet='b';
console.log(window.mylet); // gives me undefined

问题: 使用全局let,如果我可以使用var对象中的window定义某些内容,我可以查看哪些地方吗?

更一般地
var myvar='a'是否等同于window.myvar='a'
我听到人们说在全球范围内,letvar的行为相同,但这不是我所看到的。

1 个答案:

答案 0 :(得分:17)

  

我听到人们说在全球范围内,让和var表现得很好   同样,但这不是我所看到的。

是的,是的,不是。要回答您的问题,在绝大多数情况下,letvar在全局声明时都相同,但存在一些差异。

解释:全局环境记录是JS保留所有代码的逻辑和内存值的地方。但是,此全局环境记录实际上是一个封装对象环境记录声明性环境记录的组合。

更多解释:

声明性环境记录将绑定存储在内部数据结构中。不可能以任何方式掌握该数据结构(考虑功能范围)。

对象环境记录使用实际的JS对象作为数据结构。对象的每个属性都成为绑定,反之亦然。全局环境具有对象环境记录,其“绑定对象”是全局对象。这将是 Realm ,在大多数情况下是window对象。

因此,根据ECMA规范,只有 FunctionDeclarations GeneratorDeclarations VariableStatements 全局中创建绑定环境的对象环境记录。

所有其他声明(即constlet)都存储在全局环境的声明性环境记录中,该记录不基于全局对象。他们仍然声明一个变量,但不是 VariableStatement

TL; DR:两者仍然是全局的,但var存储在window对象中,而let存储在声明环境中,你可以'看看(就像你不能从函数外部访问函数范围中的变量)。在全局声明时,两个语句在使用时几乎完全相同。