在使用ES6时,一般都是推荐使用let, const来定义变量,相对var而言:
| Hoisting | Scope | Creates global properties | |
|---|---|---|---|
| var | Declaration | Function | Yes |
| let | Temporal dead zone | Block | No |
| const | Temporal dead zone | Block | No |
Temporal dead zone这个与var的Declaration有什么不一样的地方?
先看一个例子:
1 | // var定义的变量提升 |
可以查看其实TDZ类似于一个视觉的盲区,在作用域中应该意识到变量的存在,但却看不见,更用不了。
之所以需要TDZ:
- 捕获错误: 变量提升本就比较奇怪,也不太符合变量需要定义才能使用的逻辑。
const语义要求:const定义一个不可以变更的常量,只能在定义时赋值,如果存在变量提升和语义不符合。为了保持一致,所以let也有TDZ。