使用var定义变量时会发生变量提升,为什么会这样?
对于代码执行来说,分为两个阶段,准备阶段和执行阶段,准备阶段会创建作用域,作用域链,变量,形参等的声明,但是此时没有执行赋值语句,所以声明的变量为undefined,对于var是undefined,但是对于let定义的变量会直接报错。
所以这个并不是真正的原因,从定义变量来看,有三个生命周期:
声明变量
初始化变量
赋值阶段(在代码执行时才进行赋值)
var定义变量时,会执行声明变量和初始化变量,所以已经有了变量实例,但是没有赋值,所以就是undefined,let定义变量时,仅仅执行了变量声明,初始化和赋值是在代码执行时才执行,所以仅仅声明了变量,没有生成变量实例,出现暂时性死区,无法访问到变量,所以就直接报错了。