JS的階乘函數-遞歸調用/arguments對象

經典的階乘函數算法

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

這個階乘函數用到了遞歸算法,在函數有名字,而且名字不會發生變化的狀況下,這樣的定義是沒有問題的。但問題是這個函數的執行與函數名factorial牢牢耦合在了一塊兒。在把階乘函數賦值給另外一個名字時,很容易出現沒法完成遞歸調用的狀況。
在函數內部,有其中一個特殊的對象arguments。arguments的主要用途是保存函數參數,可是它有一個callee的屬性對遞歸調用頗有用處。callee屬性是一個指針,指向當前的擁有arguments對象的函數。因此咱們的階乘函數能夠重寫爲這樣:bash

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

這個重寫後的factorial()函數的函數體內,沒有再引用函數名factorial。這樣子作,不管引用函數時使用的是什麼名字,均可以保證了正常完成遞歸調用。 實現:函數

var trueFactorial = factorial;
alert (trueFactorial(5));   //120
複製代碼
相關文章
相關標籤/搜索