這次帶給大家,的注意事項有哪些,下面就是實戰案例,一起來看一下。
遞歸函數:遞歸函數是在透過名字呼叫自身的情況下構成的。
遞迴實作階乘函數:
# 方法一:透過使用函數的名字
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));
這種方式在嚴格和非嚴格模式下都有效。
相信看了本文案例你已經掌握了方法,更多精彩請關注php中文網其它相關文章!
推薦閱讀:
以上是JS的遞迴實作方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!