javascript 中的暂时死区是什么?

JavaScript 中的临时死区 (TDZ) 是指作用域中变量的创建与初始化之间的时间段。在此期间,变量处于未初始化状态,无法访问。尝试访问它将导致 ReferenceError。

要点:

  • TDZ 与 let 和 const 一起出现:与 var 不同,用 let 和 const 声明的变量不会以可访问的方式提升到其范围的顶部。
  • 初始化之前访问会抛出 ReferenceError:变量存在于内存中,但直到执行声明时才初始化。
  • TDZ 在变量初始化时结束:一旦执行声明行,变量即可变得可访问。
  • **代码示例 1:访问 TDZ 中的变量**

    console.log(x); // ReferenceError: Cannot access 'x' before initialization
    let x = 10;
    console.log(x); // 10

    解释:

  • 变量 x 由于 let 声明而存在于内存中但尚未初始化。
  • 在初始化之前尝试访问它会引发 ReferenceError。
  • **代码示例 2:带有 const 的 TDZ**

    console.log(y); // ReferenceError: Cannot access 'y' before initialization
    const y = 20;
    console.log(y); // 20

    解释:

  • const 在 TDZ 期间的行为与 let 相同。在初始化之前访问 y 会导致 ReferenceError。
  • **代码示例 3:块范围内的 TDZ**

    {
        console.log(a); // ReferenceError: Cannot access 'a' before initialization
        let a = 5;
        console.log(a); // 5
    }

    解释:

  • 变量 a 位于 TDZ 中,直到在块内执行 let a = 5 行为止。
  • **代码示例 4:没有带 var 的 TDZ**

    console.log(b); // undefined
    var b = 15;
    console.log(b); // 15

    解释:

  • 使用 var 声明的变量会被提升并用 undefined 初始化。var 没有 TDZ。
  • **代码示例 5:函数和 TDZ**

    function example() {
        console.log(c); // ReferenceError: Cannot access 'c' before initialization
        let c = 30;
    }
    example();

    解释:

  • c 位于 TDZ 中,直到执行 let c = 30 行为止。
  • **代码示例 6:具有默认参数的 TDZ**

    function test(x = y, y = 10) {
        console.log(x, y);
    }
    test(); // ReferenceError: Cannot access 'y' before initialization

    解释:

  • 默认参数按从左到右的顺序进行评估。这里,x 尝试在初始化之前访问 y,从而引发 ReferenceError。
  • **如何避免 TDZ 问题**

  • 在变量范围的顶部声明变量。
  • 如果可能的话,在声明变量之后立即初始化变量。
  • 了解 let 和 const 的块范围行为。
  • 通过牢记 TDZ,您可以编写更可预测且无错误的 JavaScript 代码。