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

temporal dead zoneTDZ

Jmingzi createdAt at 6个月前

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

git0

最后更新:2021年06月09日 16:00

鄂ICP备18011687号-1