arguments对象是由函数的实参组成的一个类数组对象,具有length属性,可以像访问数组那样去访问这个对象,但又不具有数组那些方法(例如:pop())。
看书一直疑惑到底为什么arguments对象的会与参数有着很大的关联,参数发生变化,arguments对象的对应属性也会跟着去变化???
function foo (x) {
console.log(arguments[0]); // 10
x = 20;
console.log(arguments[0]); // 20
}
foo(10);
我们可以发现,在参数x
变化的同时arguments[0]
也发生了改变,难道说是我们的参数x
与arguments[0]
指向同一块内存吗?但是事实并不是我们想得那样的,看下面严格模式下得代码:
"use strict";
function foo (x) {
console.log(arguments[0]); // 10
x = 20;
console.log(arguments[0]); // 10
}
foo(10);
严格模式下得arguments
不能和形参保持一致,这也就说明了arguments
与形参并不是指向内存中的同一块地址,仔细想一想,arguments
是类数组对象啊,对象有getter
与setter
属性啊,所以arguments
与形参的值能够保持一致是不是由于,非严格模式下,在构造类数组对象arguments
为其绑定了getter
与setter
,用代码试验下:
function foo (x) {
// obj是我们仿造arguments对象创建的
var obj = {};
Object.defineProperty(obj,"0",{
get: function () {
return x;
},
set: function (value) {
x = value;
},
enumerable: true,
configurable: true
});
console.log(arguments[0]); // 10
console.log(obj['0']); // 10
x = 20;
console.log(arguments[0]); // 10
console.log(obj['0']); // 20
}
foo(10);
结果告诉,这种说法是正确的,并且在英文版的ES规范中也有定义,在严格模式下,arguments
并没有被绑定getter与setter属性,所以不会与形参保持一致。另外不止这样的是严格模式下不能将arguments
作为函数名,变量名,当然非严格模式下我们也最好不要这样做,还有一点的就是严格模式下得arguments.callee
与arguments.callee.caller
是禁用的。