变量提升 (Hoisting) 并不是代码被物理移动了,而是 JavaScript 引擎在执行代码前,会先创建执行上下文并初始化其词法环境,这个过程导致变量和函数声明在代码执行前就已经”存在”了。

论据/示例

JavaScript 代码执行分为两个阶段:

  1. 创建阶段:进入执行上下文,创建词法环境、变量环境
    • 函数声明:创建并赋值函数对象
    • 变量声明:创建并赋值为 undefined
  2. 执行阶段:按顺序执行代码,修改词法环境中的值
// var a = 2; 实际被引擎处理为:
var a;          // 创建阶段:a = undefined
a = 2;          // 执行阶段:a = 2
  • 区分 let/const:ES6 的 letconst 也有”提升”,但存在暂时性死区,在声明前访问会报错

关联