遞迴:是一個函數通過調用自身的情況下構成的;
首先上個例子:
2
3
4
5
6
7
|
Function factorial(num){ if (num<=1){ return 1; } else { return num*factorial(num-1); } } |
這是一個經典的遞迴階乘函數,但是在js中這麼調用可能會出現一些錯誤:例如如下代碼
1
2
3
|
var anotherFactorial = factorial; factorial = null ; alert(anotherFactorial) // 出错 |
以上代碼先把factorial()函數保存在變數anotherFactorial中,然後將factorial變數設置為null,結果指向原始函數的引用只剩下一個。 但再接下來調用anotherFactioral()時候,由於必須執行factorial函數,而factoial已經不再是函數,所以就會導致錯誤,再這種情況下,使用arguments.callee可以解決這個問題。
arguments.callee是一個指向正在執行的函數的指標,因此可以用來實現對函數的遞迴呼叫。
例如:
1
2
3
4
5
6
7
|
function factorial (num){ if (num){ return 1; } else { return num*arguments.callee; } } |
arguments.callee 優點:
1、可以確保無論怎樣調用函數都不會出問題。 因此編寫遞迴函數時候,使用argments.callee總比使用函數名更保險;
注意點:嚴格模式下無效,會報錯
嚴格模式下寫法:
1
2
3
4
5
6
7
|
var factorial = ( function f(){ if (num<1){ return 1; } else { return num*f(num-1); } }) |
二、與計時器的結合使用:
js是單線程語言,但他允許通過設置超時調用和間歇時間來調度代碼在特定的時刻執行。 前者是在指定的時間過後執行代碼,而後者則是每隔指定的時間就執行一次代碼。
參數:要執行的代碼 和 以 毫碼錶示時間
1
2
3
4
5
6
7
8
9
|
//不建议传字符串,传递字符串可能导致性能损失 setTimeout( "alter('hello word')" , 1000); //推荐方式 setTimeout( function (){ alter( "Hello world" ); },1000) setInterval( function (){ alter( "Hello world" ); },1000) |
注意點:結束
超時調用的代碼都是在全域作用域執行的,因此函數中this的值在非嚴格模式下指向window物件,在嚴格模式下是undefined;
實際應用中:
使用超時調用來類比間歇調用是一種最佳模式,在開發環境下,很少使用真正的間歇調用,原因是後一個間歇調用可能會在前一個間歇調用之間啟動。
1
2
3
4
5
6
7
8
9
10
|
var num = 0, max = 0; function incrrmentNumber{ num++; if (num < max){ setTimeout(incrrmentNumber,500); } else { alert( "Done" ); } } setTimeout(incrrmentNumber,500); |
如果像上面那樣使用超時調用,則可以避免這一點。 所以不要使用間歇調用;
以上就是本文的全部內容,希望本文的內容對大家的學習或者工作能帶來一定的説明
留言列表