【发布时间】:2018-05-15 08:07:28
【问题描述】:
在我看来,我已经理解了 JavaScript 作用域和提升的基本概念。在这方面,question+answer 对我帮助很大。
不过,最近我遇到了一些让我有点吃惊的事情。考虑以下代码:
var a = 1;
if (true) {
console.log(a);
let a = 2;
}
console.log(a);
鉴于我所学到的,我希望它输出undefined 和1。虽然它的结果是Uncaught ReferenceError: a is not defined。
我的理解是,上面的代码应该等同于(因为let a = 2; 的声明部分应该被提升到最近的封闭块——在这种情况下是if):
var a = 1;
if (true) {
let a;
console.log(a);
a = 2;
}
console.log(a);
顺便说一句,这段代码产生了undefined 和1,正如我所料。
我的问题是:
- 用
let声明的变量是否在最近的封闭块内被提升?- 如果是,为什么第一个块中的代码会导致
Uncaught ReferenceError: a is not defined?
- 如果是,为什么第一个块中的代码会导致
【问题讨论】:
标签: javascript scope ecmascript-6 var let