1.定义:
暂时性死区(Temporal Dead Zone,简称TDZ)是指在 JavaScript 中使用 let 或 const 声明变量时,变量在其声明之前不能被访问或使用的特性。
在 JavaScript 中,变量声明提升是指在执行代码之前,变量声明会被提升到作用域的顶部。然而,使用 let 或 const 声明的变量会受到暂时性死区的限制。
具体来说,当程序执行到包含 let 或 const 声明的代码块时,会创建一个称为暂时性死区的区域,该区域从声明开始直到块结束。在这个区域内,变量虽然已经被声明,但是在声明之前访问该变量会导致引擎抛出一个错误。
这种行为是为了解决 JavaScript 中变量声明提升带来的一些问题。通过暂时性死区,可以在变量被声明之前阻止对变量的访问,从而避免了在变量未初始化的情况下使用它,增强了代码的可靠性。
2.该怎么理解呢?
let i = 1{//死区开始console.log(i) //死区里边拿不到外边的i,也拿不到本代码块内的i//死区结束let i = 2 console.log(i) //直到这里才能正常使用 i }
ES6 明确规定,如果区块中存在let
和const
命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。
需要注意的是,使用 var 声明的变量不存在暂时性死区,而是会被提升到其作用域的顶部,虽然初始值为 undefined。因此,在使用 let 或 const 声明变量时,要特别注意变量的作用域和声明的顺序,以避免暂时性死区带来的问题。
function bar(x = y, y = 2) {return [x, y];
}bar(); // 报错
上面代码中,调用bar
函数之所以报错(某些实现可能不报错),是因为参数x
默认值等于另一个参数y
,而此时y
还没有声明,属于”死区“.
改成如下代码:
function bar(x = 2, y = x) {return [x, y];
}
bar(); // [2, 2]
上面代码中,如果y的默认值是x,就不会报错,因为此时x已经声明了。
总结:
暂时性死区的本质就是,只要一进入当前作用域,所要使用的变量就已经存在了,但是不可获取,只有等到声明变量的那一行代码出现,才可以获取和使用该变量。
注意:ES6 规定暂时性死区和let、const语句不出现变量提升,主要是为了减少运行时错误,防止在变量声明前就使用这个变量,从而导致意料之外的行为。这样的错误在 ES5 是很常见的,现在有了这种规定,避免此类错误就很容易了。