与全局'var'不同,javascript'let'全局变量不是'window'的属性[重复]

Posted

技术标签:

【中文标题】与全局\'var\'不同,javascript\'let\'全局变量不是\'window\'的属性[重复]【英文标题】:A javascript 'let' global variable is not a property of 'window' unlike a global 'var' [duplicate]与全局'var'不同,javascript'let'全局变量不是'window'的属性[重复] 【发布时间】:2017-01-17 18:55:37 【问题描述】:

我曾经检查全局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,如果我可以从 window 对象中使用 var 定义某些内容,是否有任何地方可以查看?

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

【问题讨论】:

typeof 明确记载:“在程序和函数的顶层,let 与 var 不同,不会在全局对象上创建属性。” – developer.mozilla.org/en-US/docs/Web/javascript/Reference/…跨度> 你永远不需要测试一个变量是否被声明,你应该知道它。如果您真的希望它们是全局的,请不要使用 let - 只需分配给 window 的属性。 @Bergi 是的,我打算为 window 分配一个道具。测试是否声明了某些东西的原因是:我有一个实用程序库,有些有共同的依赖关系。如果还没有加载依赖项,我会加载它。 你应该使用一个能记住自己加载了什么和没有加载什么的加载器,所以不需要动态测试和同步(?)加载任何东西。 【参考方案1】:

我听到人们说,在全球范围内,let 和 var 是/表现 一样,但这不是我看到的。

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

解释一下:全局环境记录是 JS 为运行中的代码保存所有逻辑和内存值的地方。然而,这个全局环境记录实际上是一个复合封装了一个对象环境记录和一个声明性环境记录

更多解释:

声明性环境记录将绑定存储在内部数据结构中。以任何方式获取该数据结构都是不可能的(想想函数范围)。

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

因此,根据 ECMA 规范,只有 FunctionDeclarationsGeneratorDeclarationsVariableStatementsglobal 中创建绑定环境的对象环境记录。

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

TL;DR:两者仍然是全局的,但 vars 存储在 window 对象中,而 lets 存储在您看不到的声明性环境中(就像您不能从函数外部访问函数范围内的变量)。当全局声明时,这两个语句的使用几乎相同。

【讨论】:

错了。根据规范:声明性环境记录用于定义ECMAScript语言语法元素的效果,如FunctionDeclarationsVariableDeclarations。声明性,而不是对象。 一个好的代码示例非常适合这个答案。 谢谢。您的回复中的概念是否有参考来源? 这是使用 const 和 let.... 的最愚蠢最随机的意外副作用。

以上是关于与全局'var'不同,javascript'let'全局变量不是'window'的属性[重复]的主要内容,如果未能解决你的问题,请参考以下文章

varletconst的区别

varletconst的区别

varletconst的区别

varletconst的区别

Python3基础 当函数中的局部变量与全局变量同名了,各管各的

js局部变量与全局变量