javascript – ‘let’是否覆盖全局声明并抛出ReferenceError?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了javascript – ‘let’是否覆盖全局声明并抛出ReferenceError?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1506字,纯文字阅读大概需要3分钟。
内容图文
我正在浏览var和let文档示例之间的区别,并且正在测试当调用未声明的变量时,全局作用域会自动为它提供声明(这就是为什么以下代码段不会在任何变量中引发错误):
x = 3;
console.log(x);
(function() {
y=x+39;
})()
console.log(y);
但是,当在同一全局范围内赋值后,使用let声明一个变量:
x=3;
let x = 42;
console.log(x);
抛出以下错误之一:
ReferenceError:
x
is not defined (Chromium)ReferenceError: can’t access lexical declaration
x
before initialization (Firefox)
我明白let不允许x提升,但是因为它先前被引用(暗示来自全局范围的自动声明)在这种情况下不应该重新声明吗?
SyntaxError: Identifier
x
has already been declared
因此抛出上面的错误?
我也明白,在严格模式下,第一个片段会引发一个ReferenceError,所以这是否意味着在全局范围内强制执行严格模式的特定规则(所有变量都需要声明)?
解决方法:
你是对的,这是奇怪的行为.它给出这些错误的原因是因为它认为你试图将值3分配给let变量而不是全局值.正如其他人所提到的,这会导致暂停死区问题.
The variables are created when their containing Lexical Environment is
instantiated but may not be accessed in any way until the variable’s
LexicalBinding is evaluated
– Source (ECMAScript 8th edition)
此代码显示放置代码导致TDZ的位置:
// Accessing `x` here before control flow evaluates the `let x` statement
// would throw a ReferenceError due to TDZ.
// console.log(x);
let x = 42;
// From here on, accessing `x` is perfectly fine!
console.log(x);
您可以看到将let包装在其自己的块块中可以修复它:
x=3;
{
let x = 42;
console.log(x); // 42
}
或者,您可以在窗口对象上显式定义全局:
window.x=3;
let x = 42;
console.log(x); // 42
内容总结
以上是互联网集市为您收集整理的javascript – ‘let’是否覆盖全局声明并抛出ReferenceError?全部内容,希望文章能够帮你解决javascript – ‘let’是否覆盖全局声明并抛出ReferenceError?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。