3 回答

TA貢獻1797條經驗 獲得超6個贊
有什么區別嗎?
是。調用setTimeout()后,超時執行一定的時間; 間隔在上一個間隔觸發后執行一定的時間。
如果doStuff()函數需要一段時間才能執行,您會注意到區別。例如,如果我們使用setTimeout / setInterval表示調用,.使用*和執行JavaScript代碼觸發超時/間隔[-----],則時間軸如下所示:
Timeout:
. * . * . * . * .
[--] [--] [--] [--]
Interval:
. * * * * * *
[--] [--] [--] [--] [--] [--]
下一個復雜情況是,如果在JavaScript已經忙于執行某些操作(例如處理上一個間隔)時會觸發間隔。在這種情況下,會記住間隔,并在上一個處理程序完成后立即發生并將控制權返回給瀏覽器。因此,例如doStuff()過程有時很短([ - ]),有時很長([-----]):
. * * ? * ? * *
[-] [-----][-][-----][-][-] [-]
?表示無法立即執行其代碼的間隔觸發,而是取而代之。
因此,間隔試圖“趕上”以按時恢復。但是,它們并不排在一起:每個區間只能有一個執行掛起。(如果他們都排隊等候,瀏覽器會留下不斷擴展的未完成執行列表?。?/p>
. * ? ? x ? ? x
[------][------][------][------]
x表示無法執行或被掛起的間隔觸發,因此被丟棄。
如果你的doStuff()函數通常需要比為它設置的時間間隔更長的時間來執行,那么瀏覽器會吃100%的CPU來嘗試為它提供服務,并且可能會降低響應速度。
你用哪個?為什么?
Chained-Timeout為瀏覽器提供了保證的空閑時間; Interval嘗試確保其運行的功能盡可能接近其預定時間執行,但代價是瀏覽器UI可用性。
我會考慮一次性動畫的間隔,我希望盡可能平滑,而鏈式超時對正在進行的動畫更有禮貌,這些動畫會在頁面加載時一直發生。對于要求較低的用途(例如每30秒觸發一次微不足道的更新程序),您可以安全地使用它們。
在瀏覽器兼容性方面,setTimeout優先于setInterval,但您今天將遇到的所有瀏覽器都支持這兩種瀏覽器。多年來最后一個落后者是WinMo <6.5的IE Mobile,但希望現在也落后于我們。

TA貢獻1831條經驗 獲得超4個贊
的setInterval()
setInterval()
是一種基于時間間隔的代碼執行方法,具有在達到間隔時重復運行指定腳本的本機能力。它應該不被嵌套到它的回調函數由腳本作者,使其循環,因為它循環默認。除非你打電話,它將繼續按間隔開火clearInterval()
。
如果要循環動畫代碼或時鐘滴答,請使用setInterval()
。
function doStuff() { alert("run your code here when time interval is reached");}var myTimer = setInterval(doStuff, 5000);
的setTimeout()
setTimeout()
是,將執行一個腳本僅基于時間的代碼執行方法一次到達的時間間隔時。它不會再次重復,除非你通過將setTimeout()
對象嵌套在它調用運行的函數內來使其循環腳本。如果適合循環,除非你打電話,它將繼續按間隔射擊clearTimeout()
。
function doStuff() { alert("run your code here when time interval is reached");}var myTimer = setTimeout(doStuff, 5000);
如果您希望在指定的時間段后發生一次某些事情,請使用setTimeout()
。這是因為它只在達到指定的間隔時執行一次。
添加回答
舉報