这一篇是基于执行上下文栈
中的执行上下文继续深入。一般来说,执行上下文
中有三个重要属性:
- 变量对象( VO, Variable Object )
- 作用域链( Scope Chain )
- this
什么是变量对象(VO)
变量对象指的是与执行上下文
相关的作用域,其中存储了当前执行上下文中定义的变量以及函数声明。
变量对象的类型
变量对象的类型主要分两种:全局对象
与 活动对象
。
全局对象
介绍全局对象需要先解释全局上下文(全局执行环境)
,全局上下文中的变量主要分为两类:
- 全局定义的变量。
- 全局上下文中的函数声明。
全局变量一般指的是,在全局定义的变量
,比如:var xxx = null
。我们常用的 Math
其实就是在全局上下文中的函数声明
,所以一般说全局对象指的是window对象。
全局变量和全局函数都是作为window对象的属性和方法被创建的。
活动对象
活动对象我们又称为AO(activation object)
,一般是在函数上下文中产生。
AO
一开始只有一个变量arguments
.AO
是在函数上下文中被创建,所以在全局上下文中是不存在。
执行上下文
我们可以简单的认为,执行上下文分两个阶段,第一个是声明阶段
,第二个阶段是执行阶段
。
- 声明阶段会声明各种变量,以及函数,也包括函数中的形参。
- 执行阶段,修改各个变量的值。
声明阶段
在这个阶段中,AO
会收集所有的形参,变量声明,函数声明。
举个例子🌰 :
function changeColor(color) {
var anotherColor = '#ea4141';
function outPut() {}
var _outPut = function () {}
}
changeColor('#cccccc');
在这段代码中,AO
如下:
AO = {
arguments:{
0: '#cccccc',
length: 1
},
color: '#cccccc',
anotherColor: undefined,
outPut: reference to function outPut(){},
_outPut: undefined,
}
执行阶段
执行阶段主要是修改 AO
中的变量
AO = {
arguments:{
0: '#cccccc',
length: 1
},
color: '#cccccc',
anotherColor: '#ea4141',
outPut: reference to function outPut(){},
_outPut: reference to FunctionExpression "_outPut",
}
总结
- 变量对象一般分为两种:全局对象 与 活动对象。
- 全局变量与全局中的函数都被作为 window 属性和方法创建。
- AO 初始化的时候只有一个 arguments 对象。
- 执行上下文中,声明阶段收集各种变量与函数,执行阶段修改值。