变量生命周期
变量生命周期:声明(作用域注册一个变量)、初始化(分配内存,初始化为undefined)、赋值
- var:遇到有var的作用域,在任何语句执行前都已经完成了声明和初始化,也就是变量提升而且拿到undefined的原因由来
- function: 声明、初始化、赋值一开始就全部完成,所以函数的变量提升优先级更高
- let:解析器进入一个块级作用域,发现let关键字,变量只是先完成声明,并没有到初始化那一步。此时如果在此作用域提前访问,则报错xx is not defined,这就是暂时性死区的由来。等到解析到有let那一行的时候,才会进入初始化阶段。如果let的那一行是赋值操作,则初始化和赋值同时进行
- const、class都是同let一样的道理
比如解析如下代码步骤:
{
// 没用的第一行
// 没用的第二行
console.log(a) // 如果此时访问a报错 a is not defined
let a \= 1
}
步骤:
- 发现作用域有let a,先注册个a,仅仅注册
- 没用的第一行
- 没用的第二行
- a is not defined,暂时性死区的表现
- 假设前面那行不报错,a初始化为undefined
- a赋值为1
对比于var,let、const只是解耦了声明和初始化的过程,var是在任何语句执行前都已经完成了声明和初始化,let、const仅仅是在任何语句执行前只完成了声明
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。