JavaScript 在执行代码之前会进行预编译(预处理),主要包括:
// var 变量提升
console.log(a); // undefined
var a = 1;
// 等价于
var a;
console.log(a); // undefined
a = 1;
// 函数声明提升
foo(); // 'hello'
function foo() {
console.log('hello');
}
// let/const 暂时性死区
console.log(b); // ReferenceError
let b = 2;
console.log(foo); // [Function: foo]
var foo = 1;
function foo() {}
执行上下文是 JavaScript 代码执行时的环境,包含三个重要组成部分:
变量对象(VO)/活动对象(AO)
作用域链(Scope Chain)
this 指向
function outer() {
var a = 1;
function inner() {
console.log(a); // 通过作用域链查找
}
inner();
}
outer();
创建阶段
执行阶段
function test(a, b) {
var c = 1;
function d() {}
var e = function() {};
}
// 创建阶段(伪代码)
AO = {
arguments: {
0: a,
1: b,
length: 2
},
a: undefined,
b: undefined,
c: undefined,
d: function d() {},
e: undefined
}
// 执行阶段
AO = {
arguments: {
0: a,
1: b,
length: 2
},
a: 1,
b: 2,
c: 1,
d: function d() {},
e: function() {}
}
// 全局执行上下文
var globalVar = 'global';
function globalFunc() {
console.log('global function');
}
function test() {
var localVar = 'local';
console.log(localVar);
}
test(); // 创建函数执行上下文
test(); // 再次创建新的函数执行上下文