var vs let/const

149 阅读1分钟

变量提升

首先要明白变量提升提升的是什么? 提升内容有三个: 1.声明提升; 2.初始化提升; 3.赋值提升

  • var/let/const都会进行变量提升, 只不过提升内容有所不同
    • var提升了声明和初始化
    • let/const只提升了声明, 所以导致了产生暂时性死区的存在
  • function声明, 初始化和赋值一开始就全部完成了提升, 即变量提升的优先级最高

声明过程

  • var, 遇到有var的作用域, 在任何语句执行前完成了 声明和初始化提升
  • let/const, 当解析器进入块级作用域, 对let/const变量只进行 声明提升
    • 若在此时访问会得到Cannot access '*' before initialization, 即暂时性死区
    • 等执行到 let/const 所在那一行代码, 才会初始化和赋值
//demo 1.0
let temp = 'name';
if (true) {
   console.log(temp); // 暂时性死区, `Cannot access '*' before initialization`
   let temp; // 上一行代码出现了暂时性死区说明 let 变量确实提升了, 若没有提升上一行代码访问到的就应该是外部值为 'name' 的 temp 了
}

// demo 2.0
if (true) {
  let temp; // 此处进行了初始化, 值为 undefined
  console.log(temp); // undefined
  temp = 6; // 赋值
  console.log(temp); // 6
}

内存分配

  • var直接在栈内存中预分配内存, 等到执行到赋值语句时再存储值(基本类型)或一个指向堆内存的指针(引用类型)
  • let / const 都不会预分配内存且分配前会做变量重复检查