执行上下文(AO、GO)和函数执行流程
-
全局上下文GO
-
函数上下文AO
https://www.cnblogs.com/xsg1/p/11131908.html
GO: 全局上下文,Global Object,它在全局代码执行前产生
产生的时候做了什么呢?分为以下几个步骤:
- 寻找变量声明
- 寻找函数声明,赋值
- 代码执行
AO: Activation Object 活跃对象,函数上下文,在函数执行前产生
产生的时候做了什么呢?分为以下几个步骤:
- 寻找形参和变量声明
- 实参赋值给形参
- 寻找函数声明,赋值
- 代码执行
例题
function test(a){
console.log(a);
var a = 1;
console.log(a);
function a(){};
console.log(a);
console.log(b);
var b = function(){};
console.log(b);
function d(){}
}
test(2);
实际步骤:
function test(a){
var a; // 函数声明提前
// 应该还有一步:a = 2, 实参赋值给形参
function a(){}; // 不过被覆盖了
var b;
function d(){};
console.log(a); // function a(){} , 如果没有function a(){};会输出a=2
a = 1;
console.log(a); // 1
console.log(a); // 1
console.log(b); // undefined
b = function(){};
console.log(b); // function b(){}
}
test(2);
函数执行过程
- 为函数创建一个执行环境
- 复制函数的 [[scopes]] 属性中的对象构建起执行环境的作用链域
- 创建函数活动对象并推入执行环境作用链域的前端
- 执行代码
- 销毁执行环境和活动对象(闭包情况下活动对象仍被引用没被销毁)