【发布时间】:2017-05-17 23:57:11
【问题描述】:
我正在查看 var 和 let 文档示例之间的差异,并且正在测试当调用未声明的变量时,全局范围会自动为其提供声明(这就是为什么下面的 sn-p 不会抛出任何变量中的错误):
x = 3;
console.log(x);
(function() {
y=x+39;
})()
console.log(y);
但是,当一个变量在同一全局范围内赋值后用let 声明时:
x=3;
let x = 42;
console.log(x);
抛出以下错误之一:
ReferenceError:
x未定义(Chromium)ReferenceError:在初始化之前无法访问词法声明
x(Firefox)
我知道let 不允许x 提升,但由于它之前被引用(暗示来自全局范围的自动声明),在这种情况下不应该重新声明吗?
SyntaxError:Identifier
x已被声明
因此抛出了上面的错误?
我也明白,在 strict mode 下,第一个 sn-p 会抛出 ReferenceError,这是否意味着 let 会强制执行此特定的严格模式规则(所有变量都需要声明)在全局范围内?
【问题讨论】:
-
letis hoisted as well,您只是在时间死区访问它。我看不出这与严格模式有什么关系。
标签: javascript scope ecmascript-6 global let