ES-262学习笔记:全局对象和活动对象的特点
Time: 11-08-8 Comments: 0
前一篇文章提到:在进行变量初始化时,全局代码和函数代码分别以”全局对象和活动对象”作为变量对象。这篇文章来解下这两种对象的特别之处。。。
一. 全局对象
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);
