本文實例分析了JavaScript遞歸操作。分享給大家供大家參考,具體如下:
問題
一個簡單的遞歸,求n的階乘:
function factorial(n){ if (n<=1) { return 1; }else{ return factorial(n-1)*n; } }
如果像下面這樣使用它,則會出錯:
var fcopy = factorial; factorial = null; alert(fcopy(3));
因為fcopy指向的函數實體調用了factorial,而factorial已經被釋放。
解決的辦法
使用arguments.callee
執行流進入函數時會創建函數的運行環境(作用域鏈等),包括 arguments 這個特殊對象,arguments對象有個屬性指向函數本身:arguments.callee 。
function factorial(n){ if (n<=1) { return 1; }else{ return arguments.callee(n-1)*n; } }
不過callee在嚴格模式下不可用。
使用函數表達式
var factorial = (function f(n){ if (n<=1) { return 1; }else{ return f(n-1)*n; } })
這並非使用了什麼新的技術,只是在原來概念上的一種應用,在定義 factorial 時,直接創建一個函數,再將此函數的引用賦值給factorial。
更多關於JavaScript相關內容感興趣的讀者可查看本站專題:《JavaScript遍歷算法與技巧總結》、《JavaScript數組操作技巧總結》、《JavaScript數學運算用法總結》、《JavaScript數據結構與算法技巧總結》、《JavaScript切換特效與技巧總結》、《JavaScript查找算法技巧總結》、《JavaScript動畫特效與技巧匯總》及《JavaScript錯誤與調試技巧總結》
希望本文所述對大家JavaScript程序設計有所幫助。