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了;
相關文章
相關標籤/搜索