JavaScript 变量提升机制

理解 JavaScript 中变量提升的原理和执行过程

问题

什么是变量提升?为什么在声明前可以访问变量和函数?

解答

变量提升发生在执行上下文的创建阶段。当函数运行时,JavaScript 引擎会:

  1. 创建执行上下文
  2. 将执行上下文入栈
  3. 当执行上下文处于栈顶时,开始执行代码

在创建执行上下文时,会完成三件事:

  • 创建变量对象
  • 创建作用域链
  • 确定 this 指向

变量对象的创建过程(变量提升的本质):

  1. arguments 创建属性,值为 arguments 对象
  2. 扫描函数声明(function),创建同名属性,值为函数引用
  3. 扫描变量声明(var),创建同名属性,值为 undefined
console.log(a); // undefined
console.log(foo); // [Function: foo]

var a = 1;
function foo() {
  console.log('foo');
}

// 等价于:
var a = undefined;
function foo() {
  console.log('foo');
}
console.log(a); // undefined
console.log(foo); // [Function: foo]
a = 1;

关键点

  • 变量提升发生在执行上下文创建阶段,代码执行之前