1.arguments 是在function方法里面的,是实参数组,用法是挺多的,下面来记录一下
2.利用arguments实现方法的重载
1 //01.使用argument模拟方法重载 2 function sayHi() { 3 if (arguments.length == 1) { 4 alert(arguments[0]); 5 } 6 if(arguments.length==2){ 7 alert(arguments[0]+arguments[1]); 8 } 9 }
3.arguments 的callee属性: 是一个指针,说白了就是当前函数对象的指针
案例:(阶乘函数)
1 function getFac(num) { 2 if (num <= 1) 3 return num; 4 return num * getFac(num - 1); 5 } 6 7 var result = getFac(5);//5*4*3*2*1 8 alert(result);
显示结果如下:
但是现在我要把 var test= getFac(num),然后改写它的方法
1 var test = getFac;//把阶乘地址赋给test 2 getFac = function (num) { 3 return num; 4 } 5 var res = test(5); 6 alert(res);
显示结果如下:
这是为什么呢?
因为var test = getFac;是把getFac的方法地址赋值给变量test,test存放的是上面getFace 方法的地址,但是接下来
getFac = function (num) {
return num;
}的改写则是改写了原来的getFac方法,这里很重要的一点就是,getFac方法改写了,会新增加一个方法的地址赋值到getFac面,而test还是有指向原来getFac方法的方法指针,因此var res = test(5);时,直接调用原来的getFac方法,执行到 return num * getFac(num - 1);时候,因为getFac改写了,直接return num因此是5*4=20
那如果我要显示原来的120,应该怎么做,很简单,因为arguments里面有个 callee属性,只需要改一句代码
1 function getFac(num) { 2 if (num <= 1) 3 return num; 4 return num * arguments.callee(num-1);//这个argument是一个指针,直接指向getFace方法原来的地址,而不是后面的getFace改写之后的方法 5 }
结果就变成120了;