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