遞歸

*本文來自《javaScript高級程序設計》的學習筆記


遞歸函數是在一個函數內部通過名字調用自身的情況下構成的

例如:

//####################Test01 begin#################
function factorial(num) {
    if (num <= 1) {
        return 1;
    } else {
        return num * factorial(num - 1);
    }
}
var anotherFactorial = factorial;
factorial = null;
alert(anotherFactorial(4));
//####################Test01 end#################
/**
 * 以上代碼先把factorial()函數保存在變量anotherFactorial中;
 * 然後將factorial置爲null,結果指向原始函數的引用只剩下一個;
 * 在接下來調用anotherFactorial()時,由於必須執行factorial(),而factorial已經被置爲null,不再是函數,所以就會導致錯誤
 * 在這種情況下,使用arguments.callee 可以解決這個問題。
 * arguments.callee 是一個指向正在執行的函數的指針,因此可以用它來實現對函數的遞歸調用,例如:
 */
//####################Test02 begin#################
function factorial2(num) {
    if (num <= 1) {
        return 1;
    } else {
        return num * arguments.callee(num - 1);
    }
}
var anotherFactorial2 = factorial2;
factorial2 = null;
alert(anotherFactorial2(4));
//####################Test02 end#################
/**
 *在嚴格模式下,不能通過腳本訪問arguments.callee,訪問這個屬性會導致報錯。
 *這種情況下可以使用命名函數表達式來達成相同的結果,例如:
 */
//####################Test03 begin#################
var factorial3 = (function f(num) {
    if (num <= 1) {
        return 1;
    } else {
        return num * f(num - 1);
    }
});
var anotherFactorial3 = factorial3;
factorial3 = null;
alert(anotherFactorial3(4));
//####################Test03 end#################
*個人認爲沒有必要搞得這麼複雜,正常是不會把已經聲明的一個函數置爲null

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章