什么叫暂时性死域

发布时间 2023-07-21 08:19:47作者: kitebear

在 JavaScript 中,当一个函数被调用时,会创建一个执行上下文(execution context),该上下文中包含函数的作用域(scope),并将其推入执行上下文栈(Execution Context Stack)中进行管理。当函数执行完毕时,其对应的执行上下文会被弹出执行上下文栈,该函数的作用域也会随之销毁。

在函数内部,如果存在使用 var 声明的变量,其会被添加到该函数的作用域中,并在函数执行完成后销毁。而对于使用 let 或 const 声明的变量,其会形成暂时性死区(Temporal Dead Zone,简称 TDZ),在变量声明前进行访问操作则会报错。其原因是变量虽然已经在作用域内声明,但是由于作用域尚处于 TDZ 中,无法访问该变量。

这种情况在前端开发中非常常见,特别是在使用 const 和 let 时,需要注意变量声明的位置。具体地,在使用 let、const 声明变量时,如果需要在当前作用域范围内引用变量,则需要确保变量在引用前已经声明,否则会导致代码出错。例如:

function test() {
  console.log(typeof x); // Uncaught ReferenceError: Cannot access 'x' before initialization
  let x;
}

test();

上述代码中,由于变量 x 被声明为 let,形成了 TDZ,因此在 x 被声明后才能进行访问操作。对 x 变量进行访问操作时,将抛出 Uncaught ReferenceError: Cannot access 'x' before initialization 错误。