一、变量对象(Variable Object)
1.1 什么是变量对象
- 变量对象(
Variable Object
)是一个 与执行上下文相关 的特殊对象,它存储着在 上下文中声明 的以下内容:
- 变量 —
var xxx
,变量声明- 函数声明(
Function Declaration
)—-function xxx () {}
- 函数的形参(
arguments
) —-function xxx (a){}
,a
就是形参
1.2 变量对象的创建步骤
- 请看下图
具体步骤
- 检查函数的所有 形参(
arguments
)。
- 检查当前上下文中的参数,建立该对象下的属性与属性值。
- 检查当前上下文的 函数声明 ,就是使用
function
关键字声明的函数。
- 在变量对象中以函数名建立一个属性,属性值为指向该函数所在内存地址的引用。
- 如果变量对象已经存在相同名称的属性,则完全替换这个属性。
- 检查当前上下文中的 变量声明。
- 每找到一个变量声明,就在变量对象中以变量名建立一个属性,属性值为
undefined
。- 如果变量名称跟已经声明的形式参数或函数相同,则变量声明不会干扰已经存在的这类属性。
1.3 变量对象创建实例
- 代码如下:
function test(a, b) {
console.log(foo); // function
console.log(bar); // undefined
var foo = 'Hello';
console.log(foo); //Hello
var bar = function () {
return 'world';
};
function foo() {
return 'hello';
}
}
test(10);
- 变量对象创建过程
- 上述代码的最终执行顺序:
二、活动对象(Activation Object)
- 活动对象其实就是变量对象。
- 函数环境中,在 执行上下文创建阶段 是
VO
,到了 执行上下文的执行阶段,VO
会转换成AO
(活动对象)。VO
和AO
是同一个对象,只是处于执行上下文的不同生命周期。
补充:全局环境下只存在变量对象
VO