qingely / study

学习笔记
0 stars 0 forks source link

我眼中变量提升的本质 #4

Open qingely opened 6 years ago

qingely commented 6 years ago

变量的生命周期可分几 个阶段:声明 - 系统初始化 - (手动初始化 )- 赋值 - 回收销毁

变量的声明其实就是一个创建变量的过程;变量的初始化其实就是一个定义(define)变量的过程,变量的系统初始化将变量值定义为undefined,而手动初始化将变量值定义为需要的值。变量声明了,也就存在了;变量初始化了,也就可以访问了。

JS 引擎在执行时有这样的特点:执行流每到一个执行环境时会先提取出具有声明的变量,并根据声明方式不同将其以不同形式存储到对应空间:

这样,再执行的时候就好像:

因为变量提升并没有一个明确的定义,所以有一批人认为 let 也有变量提升作用。其实并不贴切。因为相比之下, let / const 声明方式下的声明过程的提升,只是JS 引擎在执行时对所有具有声明的变量的一种通用行为,且并不能提前访问所声明的变量。

综上,将变量的 系统初始化手动初始化 统一视为广义初始化,那么变量提升定义就可以归纳为:变量的声明与初始化的两个过程同时被提升的现象。

关键理解声明系统初始化是两个单独的过程。


知识面有限,有不准确的地方欢迎指正。