遞歸:
遞歸函數在定義的時候需要調用自己,因此會用到自己的函數名;但是在js中會出現如下的問題:
<pre>
function factorial(num) {
if (num <= 1)
return 1;
else
return num * factorial(num - 1);
}
var anotherFactorial = factorial;
factorial = null;
anotherFactorial(6);
//由于迭代過程中需要用到factorial,但該值已被賦值為空,所以會出錯
</pre>
解決方法:有兩種方式可以解決該問題
1.使用 arguments.callee:
該參數指向一個正在執行的函數的指針,因此可以用它來實現函數對自身的遞歸調用。
<pre>
function factorial(num) {
if (num <= 1)
return 1;
else
return num * arguments.callee(num - 1);
}
var anotherFactorial = factorial;
factorial = null;
alert(anotherFactorial(6));
</pre>
這種寫法之下,即便factorial被賦值為空,依然可以引用自身來實現遞歸。
2.使用命名函數表達式
但是在嚴格模式之下,不可以訪問arguments.callee屬性,因此可以使用命名函數表達式:
<pre>
eg:var factorial = (function f(num) {
if (num <= 1)
return 1;
else
return num * f(num - 1);});
</pre>