在JavaScript中,arguments属于当前对象的一个内置属性,arguments是一个类Array对象,但不是Array。比如:
Array.prototype.testArg = "test";
function funcArg() {
console.log(funcArg.arguments.testArg);
console.log(funcArg.arguments[0]);
}
console.log(new Array().testArg); // result: "test"
funcArg(10); // result: "undefined" "10"
arguments对象的长度是由实参个数决定的,形参是函数内部重新开辟内存空间储存的变量,与arguments对象内存空间不重叠。对于arguments和值都存在的情况下,两者值都是同步的,但是针对一个无值得情况下,无值是不会得以同步的,如:
function fun(a, b, c){
console.log(arguments.length); // result: "2"
a = 100;
console.log(arguments[0]); // result: "100"
arguments[0] = "testArg";
console.log(a); // result: "testArg"
console.log(c); // result: "undefined"
c = 2012;
console.log(arguments[2]); // result: "undefined"
}
fun(1, 2);
arguments对象中有一个非常有用的属性:callee。arguments.callee返回此arguments对象所在的当前函数引用。在使用函数递归调用时推荐使用arguments.callee代替函数名本身。
function sum(a){
if(a==1){
return 1;
}
return a + arguments.callee(a-1);
}
var num = sum(4);
console.log(num); // 10
在平时的封装和使用JS过程中,callee方法用的比较少,其它一般都会用到,现在,我在用几句话在来总结一下对arguments的理解:
1、arguments像数组,是一个Arguments对象实例。
2、arguments有length属性,代表传给函数的参数个数。
3、可以数组下标访问参数,如arguments[0],无数组其它方法。
4、存储的是实参不是行参。
5、可以使用callee属性调用自身。