变量提升
首先要明白变量提升提升的是什么? 提升内容有三个: 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都不会预分配内存且分配前会做变量重复检查