在使用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
。