關(guān)于JavaScript定時(shí)機(jī)制的總結(jié)
要理解JavaScript的定時(shí)機(jī)制,就要知道JavaScript的運(yùn)行機(jī)制。
首先聲明,JavaScript是單線程運(yùn)行(JavaScript引擎線程)事件驅(qū)動(dòng)。
一、瀏覽器中有多個(gè)線程
一款瀏覽器中包含的最基本的線程:
1、JavaScript引擎線程。
2、定時(shí)器線程,setInterval和setTimeout會(huì)觸發(fā)這個(gè)線程。
3、瀏覽器事件觸發(fā)線程,這個(gè)線程會(huì)觸發(fā)onclick、onmousemove和其它瀏覽器事件。
4、界面渲染線程,負(fù)責(zé)渲染瀏覽器界面HTML元素。注意:在JavaScript引擎運(yùn)行腳本期間,界面渲染線程都是處于掛起狀態(tài)的。也就是說(shuō)當(dāng)使用JavaScript對(duì)界面中的節(jié)點(diǎn)進(jìn)行操作時(shí),并不會(huì)立即體現(xiàn)出來(lái),要等到JavaScript引擎線程空閑時(shí),才會(huì)體現(xiàn)出來(lái)。(這個(gè)最后說(shuō))
5、HTTP請(qǐng)求線程(Ajax請(qǐng)求也在其中)。
以上這些線程在瀏覽器內(nèi)核的控制下,相互配合,完成工作(具體我也不知道)。
二、任務(wù)隊(duì)列
我們知道JavaScript是單線程的,所有JavaScript代碼都在JavaScript引擎線程中運(yùn)行。阮一峰老師的文章中叫這個(gè)線程為主線程,是一個(gè)執(zhí)行棧。(以下內(nèi)容也主要是根據(jù)阮一峰老師的文章理解總結(jié)。)
這些JavaScript代碼我們可以把他們看成一個(gè)個(gè)的任務(wù),這些任務(wù)有同步任務(wù)和異步任務(wù)之分。同步任務(wù)(比如變量賦值語(yǔ)句,alert語(yǔ)句,函數(shù)聲明語(yǔ)句等等)直接在主線程上按順序執(zhí)行,異步任務(wù)(比如瀏覽器事件觸發(fā)線程觸發(fā)的各種各樣的事件,使用Ajax返回的服務(wù)器響應(yīng)等)按照時(shí)間先后順序在任務(wù)隊(duì)列(也可以叫做事件隊(duì)列、消息隊(duì)列)中排隊(duì),等待被執(zhí)行。只要主線程上的任務(wù)執(zhí)行完了,就會(huì)去檢查任務(wù)隊(duì)列,看有沒(méi)有排隊(duì)等待的任務(wù),有就讓排隊(duì)的任務(wù)進(jìn)入主線程執(zhí)行。
比如下面的例子:
1 <!DOCTYPE html> 2