变量提升问题

94 阅读1分钟
786214c1-5e41-453f-b960-71ec4e3a53ab

变量提升是指在js在执行之前,会把变量声明函数声明提升到当前作用域顶部的行为。准确地来说变量和函数声明在代码里的位置是不会动的,而是在编译阶段被放入内存中。

函数和变量相比,会被优先提升。这意味着函数会被提升到更靠前的位置。

var声明

function fn(){
  var x = 1
  var y = 2
}
fn()
  1. 创建一个fn的[[Scope]]
  2. fn作用域里创建xy变量并初始化undefined
  3. 执行

let声明

{
  let x = 1
  x = 2
}
  1. 找到所有 let声明的变量,并在[[Scope]]创建这些变量。
  2. 开始执行代码
  3. x = 1,将x初始化为1(如果是let x,就初始化为undefined)
  4. x = 2,将x赋值为2

debuger以下script

this: Window
a: undefined
b: <值不可用>
c: <值不可用>
d: ƒ d()

可以理解为let声明的创建和初始化过程并不是一起执行的,let的创建过程被提升了,但初始化并没有提升,所以在let变量还没有初始化之前不能使用(暂时死区)。

function声明

fn2()
function fn2(){
  console.log(2)
}
  1. 找到fn2声明的变量,并在环境中创建这些变量
  2. 将变量fn2初始化并赋值为function(){console.log(2)}
  3. 执行