1. 概述
涉及概念
- 执行上下文 execution contest
- 变量对象 variable object
- 活动对象 active object
执行上下文决定了一个封闭的执行空间,我们在这个空间中声明的变量与函数等数据都是该执行上下文的附属——通过变量对象来保存。
每个上下文拥有自己的变量对象:对于全局上下文,它是全局对象自身;对于函数,它是活动对象
2. 数据声明过程中发生了什么?
在某个执行环境中声明数据时,会将其保存在VO中,比如(变量声明,函数声明,函数形参);
例如:
var a = 10;
function test(x){
var b = 20;
}
test(30)
对应的变量对象是
//全局上下文变量对象
VO(global context){
a :10;
test:<reference to function>
}
//test函数中变量对象
VO(test functioncontest){
x:30;
b:20;
}
抽象一下:变量初始化的一般行为
- 全局上下文变量对象:VO ===THIS == GLOBAL
- 函数上下文变量对象:VO ===AO,并且添加参数对象和formal parameters
这里出现了一个概念叫AO:活动对象,因为在函数执行上下文中,VO是不能直接访问的,此时由AO扮演VO的角色。活动对象在进入函数上下文时被创建,通过函数的arguments属性被初始化,其值为arguments对象。arguments对象属性包括
- Callee:指向当前函数的引用
- length:真正传递的参数个数
- properties-index
2.1 处理上下文的两个阶段
- 进入执行上下文
- 执行代码
2.1.1 进入执行上下文
进入时,VO已经包含了:函数所有形参,所有函数声明,所有变量声明。
例子:
function test(a,b){
var c = 10;
function d(){};
var e = function _e(){};
(function x(){});
}
test(10);
当我们传递10进入函数上下文时
AO(test){
a:10,
b:undefined,
c:undefined,
d:<reference to FD 'd'>
e:undefined
}
2.1.2 执行阶段
AO['c'] = 10;
AO['e']= <reference to fe '_e'>;
这里函数X 是从未被保存在内存中的。
网友评论