2 回答

TA貢獻(xiàn)1942條經(jīng)驗(yàn) 獲得超3個(gè)贊
都是等待執(zhí)行完畢后執(zhí)行的,可以嘗試跑這段代碼:
123 | setInterval ( function () { alert( '每次同時(shí)只會(huì)出現(xiàn)一個(gè)' ); }, 3000); |
setTimeout 這個(gè)函數(shù)是在延時(shí)后執(zhí)行 1 次。而 setInterval 是一直延時(shí)、執(zhí)行重復(fù)。

TA貢獻(xiàn)2080條經(jīng)驗(yàn) 獲得超4個(gè)贊
setTimeout是在上一個(gè)回調(diào)函數(shù)執(zhí)行結(jié)束后,等指定的delay秒后再執(zhí)行,setInterval是上一個(gè)回調(diào)函數(shù)開始執(zhí)行后(不管有沒有執(zhí)行完)就立即等delay秒后執(zhí)行
然而
我們對(duì)JavaScript定時(shí)器存在一個(gè)誤解,JavaScript其實(shí)是運(yùn)行在單線程的環(huán)境中的,這就意味著定時(shí)器僅僅是計(jì)劃代碼在未來(lái)的某個(gè)時(shí)間執(zhí)行,而具體執(zhí)行時(shí)機(jī)是不能保證的,因?yàn)轫?yè)面的生命周期中,不同時(shí)間可能有其他代碼在控制JavaScript進(jìn)程。在頁(yè)面下載完成后代碼的運(yùn)行、事件處理程序、Ajax回調(diào)函數(shù)都是使用同樣的線程,實(shí)際上瀏覽器負(fù)責(zé)進(jìn)行排序,指派某段程序在某個(gè)時(shí)間點(diǎn)運(yùn)行的優(yōu)先級(jí)。
我們可以可以把JavaScript想象成在時(shí)間線上運(yùn)行。當(dāng)頁(yè)面載入的時(shí)候首先執(zhí)行的是頁(yè)面生命周期后面要用的方法和變量聲明和數(shù)據(jù)處理,在這之后JavaScript進(jìn)程將等待更多代碼執(zhí)行。當(dāng)進(jìn)程空閑的時(shí)候,下一段代碼會(huì)被觸發(fā)
除了主JavaScript進(jìn)程外,還需要一個(gè)在進(jìn)程下一次空閑時(shí)執(zhí)行的代碼隊(duì)列。隨著頁(yè)面生命周期推移,代碼會(huì)按照?qǐng)?zhí)行順序添加入隊(duì)列,例如當(dāng)按鈕被按下的時(shí)候他的事件處理程序會(huì)被添加到隊(duì)列中,并在下一個(gè)可能時(shí)間內(nèi)執(zhí)行。
- 2 回答
- 0 關(guān)注
- 650 瀏覽
添加回答
舉報(bào)