变量对象VO
变量对象VO是与执行上下文相关的特殊对象,用来存储上下文的函数声明,函数形参和变量。在global全局上下文中,变量对象也是全局对象自身,在函数上下文中,变量对象被表示为活动对象AO。
变量对象VO存储上下文中声明的以下内容
{
函数声明FD(如果在函数上下文中),—-不包含函数表达式
函数形参function arguments,
变量声明–注意b=10不是变量,但是var b = 10;是变量,有变量声明提升
var a = 10;
function test(x) {
var b = 20;
};
test(30);
// 全局上下文的变量对象
VO(globalContext) = {
a: 10,
test: <reference to function>
};
// test函数上下文的变量对象
VO(test functionContext) = {
x: 30,
b: 20
};
变量对象VO分类
全局上下文的变量对象VO,函数上下文的变量对象VO。
//全局上下文的变量对象VO就是全局对象GlobalContextVO
VO(globalContext) === global;
(VO === this === global)
函数上下文变量对象FunctionContextVO
(VO === AO, 并且添加了<arguments>(形参类数组)和<formal parameters>(形参的值))
活动变量AO
在函数执行上下文中,VO是不能直接访问的,此时由活动对象AO扮演VO的角色
当函数被调用后,这个特殊的活动对象就被创建了。它包含普通参数与特殊参数对象(具有索引属性的参数映射表)。活动对象AO在函数上下文中作为变量对象VO使用。
Arguments对象是活动对象的一个属性,它包括如下属性:
callee — 指向当前函数的引用
length — 真正传递的参数个数
properties-indexes (字符串类型的整数) 属性的值就是函数的参数值(按参数列表从左到右排列)。
properties-indexes内部元素的个数等于arguments.length. properties-indexes 的值和实际传递进来的参数之间是共享的。
function foo(x, y, z) { console.log(foo.name); //foo // 声明的函数参数数量arguments (x, y, z) console.log(foo.length); // 3 // 真正传进来的参数个数(only x, y) console.log(arguments.length); // 2 // 参数的callee是函数自身 console.log(arguments.callee === foo); // true // 参数共享 console.log(x === arguments[0]); // true console.log(x); // 10 arguments[0] = 20; console.log(x); // 20 x = 30; console.log(arguments[0]); // 30 // 不过,没有传进来的参数z,和参数的第3个索引值是不共享的 z = 40; console.log(arguments[2]); // undefined arguments[2] = 50; console.log(z); // 40 } foo(10, 20);