前一篇文章提到:在进行变量初始化时,全局代码和函数代码分别以”全局对象和活动对象”作为变量对象。这篇文章来解下这两种对象的特别之处。。。

一. 全局对象

1. 全局对象是独一无二的,它在控制进入任何执行上下文之前创建;
2. 初始的全局对象拥有这些属性:内置对象,如Math,String,Date,parseInt等;
宿主定义的属性,如window属性;
3. 它不能被当作构造器和函数使用;
4. 它的原型和类型(typeof的值)取决于实现。

二. 活动对象

1. 当控制进入一个函数执行上下文时,会创建一个活动对象并与函数执行上下文相关联;
2. 在变量初始化时,活动对象被作为变量对象;
3. 初始的活动对象仅有一个arguments属性,属性值为Arguments对象;
4. ECMAScript程序可以访问变量对象的成员,但不能访问变量对象本身;
5. 对于一个调用,如果其基础对象是活动对象,那么该调用的this值为null(最终的this值为全局对象)。

三. Arguments对象

当控制进入一个函数执行上下文时,会创建一个Arguments对象,并按照下面的顺序初始化:

1. 将Arguments对象的[[Prototype]]属性值设置为Object.prototype;
2. 为Arguments对象创建一个callee属性,属性值为函数对象本身;
3. 为Arguments对象创建一个length属性,属性值为实参的数量;
4. 将实参作为属性值,按序添加到Arguments对象上,属性名依次为0,1,...;

Arguments对象上的实参属性,与活动对象上对应的形参属性共享属性值,即在其中一个对象上改变属性值,另一个对象的相应属性也会发生同样的改变。关于这一点,可以通过下面的例子得到证明:

// 以下例子,在IE6~9,FF4+,Chrome11+,Safari 5.0.3,Opera 11.50测试通过

例_1:
function a(x, y) {
    alert(x === arguments[0]); // true
}
a(1,2);

例_2:
function a(x, y) {
    x = 10;
    alert(x === arguments[0]); // true
}
a(1,2);

例_3:
function a(x, y) {
    arguments[0] = 10;
    alert(x === arguments[0]); // true
}
a(1,2);

四. 参考资料

1. ecmascript 262-3(pdf)

,

Leave a comment!