一、什么是暂时性死区?
要知道什么是TDS-Temporal Dead Zone(暂时性死区),先来看一段代码:

03D4E6B4-729A-4527-A945-67C1AA7181E4.png
使用 var 关键字和使用 let 关键字声明变量有什么区别?
为何第一段代码直接报错,第二段却能打印出 undefined?
想要理解这个问题,就需要了解暂时性死区。
之前的文章里,我们讨论过 什么是块级作用域,及 var 声明与 let 和 const 声明的区别。
它们最大的区别是:
- var 关键字声明的变量创建和初始化会被提升,赋值不会被提升,这个特点表现出来就是我们常见的“变量提升”
- let 和 const 关键字声明的变量和常量创建会被提升,初始化和赋值都不会被提升,因此文章开头的例子里,会报错“cannot access before initialization”
- function 的创建、初始化和赋值都会被提升,因此可以在函数声明前执行它
二、为什么会出现暂时性死区?
function foo() {
// 暂时性死区开始
console.log(a)
// 暂时性死区结束
let a = 1
}
foo()
在这个例子中,执行 foo 函数时,由于 let 声明的变量初始化不会提升,所以在执行到 let a = 1 这行代码前,是无法获取到这个变量的。
因此,在函数的开始到变量 a 的声明语句之间,就形成了一段区域(参考例子中的注释),在这段区域中,获取变量 a 会直接报错。
这个区域就被称为 暂时性死区。