遞歸函數:遞歸函數是在通過名字調用自身的情況下構成的。
遞歸實現階乘函數:
方法一:通過使用函數的名字
function factorial(num){ if(num<=1){ return 1; }else{ return num*factorial(num-1); } } console.log(factorial(4));
結果為:24;
但是這種方法實現遞歸有一個問題,觀察以下代碼:
function factorial(num){ if(num<=1){ return 1; }else{ return num*factorial(num-1); } } var anthorFactorial=factorial; console.log(anthorFactorial(4));
結果為:24;
但是:
function factorial(num){ if(num<=1){ return 1; }else{ return num*factorial(num-1); } } var anthorFactorial=factorial; factorial=null; console.log(anthorFactorial(4));
結果為:報錯
這是因為:
我們定義的函數名,其實是指向函數的一個指針,定義的anotherFactorial 也指向了那個函數,所以調用anotherFactorial (4)可以成功的輸出24
當 factorial = null時,執行定義函數的引用就剩下了anotherFactorial,那么在調用anotherFactorial(4)就會顯示以上的錯誤的信息。
此時可以使用arguments.callee來替代函數定義中的 factorial。
方法二:通過使用arguments.callee
function factorial(num){ if(num<=1){ return 1; }else{ return num*arguments.callee(num-1); } } var anthorFactorial=factorial; factorial=null; console.log(anthorFactorial(4));
結果為:24
arguments.callee是一個指向正在執行的函數的指針,因此可以用arguments.callee來實現對函數的遞歸調用。通過使用arguments.callee來代替函數名,可以保證在調用函數時無論怎樣都不會出現問題。因此,在編寫遞歸函數時,使用argumnts.callee總比使用函數名更加保險。
但是,在嚴格模式下,不能通過腳本訪問arguments.callee,訪問這個屬性會報錯,不過可以通過命名函數表達式來達到相同的效果。
方法三:通過命名函數表達式
var factorial=function f(num){ if(num<=1){ return 1; }else{ return num*f(num-1); } }; f=null; console.log(factorial(4));
這種方式在嚴格和非嚴格模式下都有效。
總結
以上所述是小編給大家介紹的JavaScript中遞歸實現的方法及其區別,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網站的支持!
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com