我正在查看 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,所以这是否意味着let
强制执行这个特定的规则全局范围内的严格模式(所有变量都需要声明)?
最佳答案
您是否在 MDN 查看了 let
文档? ?他们用 let 描述了一个时间死区和错误。
ES6 确实将 let
变量提升到其作用域的顶部。与 var
变量不同,当使用 let
时,您不能在变量声明之前访问它。这样做失败并出现 ReferenceError
(又名 let's temporal dead zone)。
关于javascript - 'let' 是否覆盖全局声明并抛出 ReferenceError?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41451181/