题目
输出是什么
// 1.
var a = 1
if (true) {
console.log(a) // 1
var a = 2
}
// 2.
var a = 1
if (true) {
console.log(a)
let a = 2
}
考察点:
- 变量提升
- 暂时性死区
- 块级作用域
分析
第一题提升后的代码为
var a
a= 1;
if (true) {
console.log(a);
a = 2;
}
变量提升会提升到最近的函数的作用域内而非最近的块级 if 作用域内
第二题
因为存在块级作用域和 let 语法,提前调用了 let 声明变量触发暂时性死区,所以报错
核心:
变量提升提升到哪
函数顶层而非块级作用域顶层
暂时性死区的真正理解,
如果内部块级作用域内使用了 let,即使外部作用域也声明了该变量也不能提前使用该变量
输出结果:
1
Uncaught ReferenceError: Cannot access 'a' before initialization