变量提升与暂存死区的新认识
变量被声明的场景有 3 种:
- script
- 函数
- 块
从上往下是包含关系,代码在这 3 者中执行时都会拥有自己的执行上下文。
其中“暂存死区”或者“暂时死区”(temporal dead zone)简称为 TDZ 只是在“块级执行上下文”中产生。
另外一个要点是 var / let 声明变量的区别:
- var 声明的变量,在词法解析阶段就被提升到了当前词法作用域的顶部
- let 声明的变量,在词法解析后,代码被执行时才“生效”
var / let 区别的示例:
console.log(varA, letB)
var varA = 1
let letB = 2
// Uncaught ReferenceError: letB is not defined
TDZ 形成示例
// 例子 1
function foo () {
console.log(a)
let a = 1
}
foo()
// Uncaught ReferenceError: Cannot access 'a' before initialization
// 例子 2
function test(){
var foo = 33
if (foo) {
let foo = (foo + 55) // ReferenceError
}
}
test()
// 例子 3
function go(n) {
// n here is defined!
console.log(n); // Object {a: [1,2,3]}
for (let n of n.a) { // ReferenceError
console.log(n)
}
}
go({a: [1, 2, 3]})
TDZ 是用来解释** let 声明的变量只能等到执行这段代码时才进行声明和初始化**这种现象的一种术语话说法。