1. 程式人生 > >arguments.callee的作用以及緊耦合

arguments.callee的作用以及緊耦合

arguments.callee的作用
   arguments 的主要用途是儲存函式引數, 但這個物件還有一個名叫 callee 的屬性,返回正被執行的 Function 物件,也就是所指定的 Function 物件的正文,這有利於匿名函式的遞迴或者保證函式的封裝性。
   請看下面這個非常經典的階乘函式

function factorial(num){    
   if (num <=1) {         
      return 1;     
   } else {         
   return num * factorial(num-1)     
   } 
}  

定義階乘函式一般都要用到遞迴演算法;如上面的程式碼所示,在函式有名字,而且名字以後也不會變的情況下,這樣定義沒有問題。
  但問題是這個函式的執行與函式名 factorial 緊緊耦合在了一起。為了消除這種緊密耦合的現象,可以像下面這樣使用 arguments.callee

function factorial(num){    
   if (num <=1) {         
      return 1;     
   } else {         
   return num * arguments.callee(num-1);
   } 
}  

在這個重寫後的 factorial()函式的函式體內,沒有再引用函式名 factorial。這樣,無論引用函式時使用的是什麼名字,都可以保證正常完成遞迴呼叫。例如

function factorial(num){
            if(num <= 1){
                return 1;
            }else{
                return num * arguments.callee(num-1);
            }
        }
        var trueFactorial = factorial;
        alert(trueFactorial(5));    //120    


        factorial = function() {
            return 0;
        }                
        alert(trueFactorial(5));// 120 如果沒有使用arguments.callee,將返回0

在此,變數 trueFactorial 獲得了 factorial 的值,實際上是在另一個位置上儲存了一個函式的指標。然後,我們又將一個簡單地返回 0的函式賦值給 factorial 變數。如果像原來的 factorial() 那樣不使用 arguments.callee,呼叫 trueFactorial()就會返回 0。可是,在解除了函式體內的程式碼與函式名的耦合狀態之後,trueFactorial()仍然能夠正常地計算階乘;至於factorial(),它現在只是一個返回 0的函式。