786214c1-5e41-453f-b960-71ec4e3a53ab
变量提升是指在js在执行之前,会把变量声明和函数声明提升到当前作用域顶部的行为。准确地来说变量和函数声明在代码里的位置是不会动的,而是在编译阶段被放入内存中。
函数和变量相比,会被优先提升。这意味着函数会被提升到更靠前的位置。
var声明
function fn(){
var x = 1
var y = 2
}
fn()
- 创建一个fn的
[[Scope]] - 在
fn作用域里创建x、y变量并初始化为undefined - 执行
let声明
{
let x = 1
x = 2
}
- 找到所有 let声明的变量,并在
[[Scope]]中创建这些变量。 - 开始执行代码
- x = 1,将x初始化为1(如果是let x,就初始化为undefined)
- x = 2,将x赋值为2
debuger以下script
this: Window
a: undefined
b: <值不可用>
c: <值不可用>
d: ƒ d()
可以理解为let声明的创建和初始化过程并不是一起执行的,let的创建过程被提升了,但初始化并没有提升,所以在let变量还没有初始化之前不能使用(暂时死区)。
function声明
fn2()
function fn2(){
console.log(2)
}
- 找到fn2声明的变量,并在环境中创建这些变量
- 将变量fn2初始化并赋值为
function(){console.log(2)} - 执行