JavaScript 变量提升机制
理解 JavaScript 中变量提升的原理和执行过程
问题
什么是变量提升?为什么在声明前可以访问变量和函数?
解答
变量提升发生在执行上下文的创建阶段。当函数运行时,JavaScript 引擎会:
- 创建执行上下文
- 将执行上下文入栈
- 当执行上下文处于栈顶时,开始执行代码
在创建执行上下文时,会完成三件事:
- 创建变量对象
- 创建作用域链
- 确定 this 指向
变量对象的创建过程(变量提升的本质):
- 为
arguments创建属性,值为 arguments 对象 - 扫描函数声明(function),创建同名属性,值为函数引用
- 扫描变量声明(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;
关键点
- 变量提升发生在执行上下文创建阶段,代码执行之前
- 函
目录