本文主要介紹了js遞歸和定時器的相關知識。具有很好的參考價值,下面跟著小編一起來看下吧
遞歸:是一個函數通過調用自身的情況下構成的;
首先上個例子:
Function factorial(num){ if(num<=1){ return 1; }else{ return num*factorial(num-1); } }
var anotherFactorial = factorial; factorial = null; alert(anotherFactorial)// 出错
首先上個例子:
function factorial (num){ if(num){ return 1; }else{ return num*arguments.callee; } }
一個經典的遞歸階乘函數,但是在js中這麼呼叫可能會出現一些錯誤:例如如下程式碼
var factorial = (function f(){ if(num<1){ return 1; }else{ return num*f(num-1); } })
以上程式碼先把factorial()函數儲存在變數anotherFactorial中,然後將factorial變數設為null ,結果指向原始函數的引用只剩下一個。但再接下來呼叫anotherFactioral()時候,由於必須執行factorial函數,而factoial已經不再是函數,所以就會導致錯誤,再這種情況下,使用arguments.callee可以解決這個問題。
arguments.callee是一個指向正在執行的函數的指針,因此可以用來實現對函數的遞歸呼叫。 例如:
//不建议传字符串,传递字符串可能导致性能损失
setTimeout("alter('hello word')", 1000);
//推荐方式
setTimeout(function(){
alter("Hello world");
},1000)
setInterval(function(){
alter("Hello world");
},1000)
1、可以確保無論調用函數都不會出問題。因此寫遞歸函數時候,使用argments.callee總比使用函數名稱更保險;
注意點:嚴格模式下無效,會報錯
二、與定時器的結合使用:
js是單線程語言,但他允許透過設定超時呼叫和間歇時間來調度程式碼在特定的時刻執行。前者是在指定的時間過後執行程式碼,而後者則是每隔指定的時間就執行一次程式碼。
參數:要執行的程式碼和以毫秒錶示時間
var num = 0, max = 0; function incrrmentNumber{ num++; if(num < max){ setTimeout(incrrmentNumber,500); }else{ alert("Done"); } } setTimeout(incrrmentNumber,500);
注意點:結束超時調用的程式碼都是在全域作用域執行的,因此函數中this的值在非嚴格調用模式下指向window對象,在嚴格模式下是undefined;
實際應用中:使用超時調用來模擬間歇調用是一種最佳模式,在開發環境下,很少使用真正的間歇調用,原因是後一個間歇調用可能會在前一個間歇調用之間啟動。
rrreee如果像上面那樣使用超時調用,則可以避免這一點。所以不要使用間歇呼叫;
🎜更多js 遞歸和定時器的實例解析相關文章請關注PHP中文網! 🎜