*本文來自《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