var、let 和 const 区别的实现原理是什么

变量生命周期:声明(作用域注册一个变量)、初始化(分配内存,初始化为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
}

步骤:

  1. 发现作用域有let a,先注册个a,仅仅注册
  2. 没用的第一行
  3. 没用的第二行
  4. a is not defined,暂时性死区的表现
  5. 假设前面那行不报错,a初始化为undefined
  6. a赋值为1

对比于var,let、const只是解耦了声明和初始化的过程,var是在任何语句执行前都已经完成了声明和初始化,let、const仅仅是在任何语句执行前只完成了声明

posted @ 2022-06-07 10:21  下一秒钟已经不同  阅读(75)  评论(0编辑  收藏  举报