我曾经检查过全局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'
?
我听到人们说在全球范围内,let
和var
的行为相同,但这不是我所看到的。
答案 0 :(得分:17)
是的,是的,不是。要回答您的问题,在绝大多数情况下,我听到人们说在全球范围内,让和var表现得很好 同样,但这不是我所看到的。
let
和var
在全局声明时都相同,但存在一些差异。
解释:全局环境记录是JS保留所有代码的逻辑和内存值的地方。但是,此全局环境记录实际上是一个封装对象环境记录和声明性环境记录的组合。
更多解释:
声明性环境记录将绑定存储在内部数据结构中。不可能以任何方式掌握该数据结构(考虑功能范围)。
对象环境记录使用实际的JS对象作为数据结构。对象的每个属性都成为绑定,反之亦然。全局环境具有对象环境记录,其“绑定对象”是全局对象。这将是 Realm ,在大多数情况下是window
对象。
因此,根据ECMA规范,只有 FunctionDeclarations , GeneratorDeclarations 和 VariableStatements 在全局中创建绑定环境的对象环境记录。
所有其他声明(即const
和let
)都存储在全局环境的声明性环境记录中,该记录不基于全局对象。他们仍然声明一个变量,但不是 VariableStatement 。
TL; DR:两者仍然是全局的,但var
存储在window
对象中,而let
存储在声明环境中,你可以'看看(就像你不能从函数外部访问函数范围中的变量)。在全局声明时,两个语句在使用时几乎完全相同。