JavaScript 之遞歸問題的解決

遞歸:

遞歸函數在定義的時候需要調用自己,因此會用到自己的函數名;但是在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>

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 第5章 引用類型(返回首頁) 本章內容 使用對象 創建并操作數組 理解基本的JavaScript類型 使用基本類型...
    大學一百閱讀 3,270評論 0 4
  • 本文檔內容參考 《JavaScript 闖關記》之函數 函數是一段代碼,它只定義一次,但可以被執行或調用任意次。在...
    穿越人海遇見你閱讀 1,012評論 0 1
  • 定義函數的方式有兩種:函數聲明和函數表達式。 函數聲明的一個重要特征就是函數聲明提升,意思是在執行代碼前會先讀取函...
    oWSQo閱讀 686評論 0 0
  • 原文地址:C語言函數調用棧(一)C語言函數調用棧(二) 0 引言 程序的執行過程可看作連續的函數調用。當一個函數執...
    小豬啊嗚閱讀 4,674評論 1 19
  • 每當你看見細細的雨,你會想到什么呢?而我沒當看見細細的雨,總把他幻想成一條條的線,這一條條的線就是大自然給你的...
    影子落英閱讀 313評論 0 0