JavaScript引擎屬於單線程作業,意味着:在同一時間只能執行一個代碼塊,這些代碼塊的執行就阻塞了異步事件的處理。
因此,出現了"任務隊列"(task queue),我們可以將任務分為兩種:一種是同步任務(synchronous),另一種是異步任務(asynchronous)。
同步任務:在主線程上排隊執行的任務,只有前一個任務執行完畢,才能執行后一個任務;
異步任務:不進入主線程、而進入"任務隊列"(task queue)的任務,只有"任務隊列"通知主線程,某個異步任務可以執行了,該任務才會進入主線程執行。如回調函數就是異步任務
具體來說,異步執行的運行機制如下。
(1)所有同步任務都在主線程上執行,形成一個執行棧(execution context stack)。
(2)主線程之外,還存在一個"任務隊列"(task queue)。只要異步任務有了運行結果,就在"任務隊列"之中放置一個事件。
(3)一旦"執行棧"中的所有同步任務執行完畢,系統就會讀取"任務隊列",看看里面有哪些事件。那些對應的異步任務,於是結束等待狀態,進入執行棧,開始執行。
(4)主線程不斷重復上面的第三步。
只要主線程空了,就會去讀取"任務隊列",這就是JavaScript的運行機制。這個過程會不斷重復。
簡單來說,事件隊列中的任務執行的條件為:
下面用一個簡單的例子來解釋一下JavaScript處理任務處理的機制:
執行結果:
可見,定時器的回調函數是在js代碼執行完成后,並滿足了設置的時間條件,再執行的。