Skip to content
On this page

变量提升与暂存死区的新认识

变量被声明的场景有 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 声明的变量只能等到执行这段代码时才进行声明和初始化**这种现象的一种术语话说法。