GO?VO?AO?

GO?VO?AO?

我用 「剧场演出」 来比喻这些概念

GO (Global Object)

全局上下文对象(就是全局变量)

1
2
var globalProp = "剧场灯光";  // 🎯 放入GO
function stageManager() { /*...*/ } // 🎯 放入GO

预编译阶段

1
2
3
4
GO = {
globalProp: undefined, // 先摆上道具标签
stageManager: function(){...} // 导演剧本提前挂好
}

执行阶段

1
2
3
4
GO = {
globalProp: "剧场灯光", // 道具就位
stageManager: function(){...}
}

VO (Variable Object)

变量对象

每个执行上下文都有

上下文创建到销毁

AO (Activation Object)

活动对象

函数调用时临时创建,调用结束销毁

用一个面试题例子来理解

1
2
3
4
5
6
var a = 1;
function test() {
console.log(a); // 🤔 输出什么?
var a = 2;
}
test();

1.全局GO(初始): { a: undefined, test: function }

2.var a = 1;GO : { a: 1, test: function }

3.test();创建AO : { a: undefined }

4.console.log(a) : AO位于作用域最顶层,{ a: undefined } ,输出 undefined

5.var a = 2;: AO : { a: 2 }

6.调用函数结束,AO数据销毁,GO : { a: 1, test: function }