arguments 函数内部属性

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了;
相关文章
相关标签/搜索