变量提升 (Hoisting) 并不是代码被物理移动了,而是 JavaScript 引擎在执行代码前,会先创建执行上下文并初始化其词法环境,这个过程导致变量和函数声明在代码执行前就已经”存在”了。
论据/示例
JavaScript 代码执行分为两个阶段:
- 创建阶段:进入执行上下文,创建词法环境、变量环境
- 函数声明:创建并赋值函数对象
- 变量声明:创建并赋值为
undefined
- 执行阶段:按顺序执行代码,修改词法环境中的值
// var a = 2; 实际被引擎处理为:
var a; // 创建阶段:a = undefined
a = 2; // 执行阶段:a = 2- 区分
let/const:ES6 的let和const也有”提升”,但存在暂时性死区,在声明前访问会报错