從Event Loop談JS的執行機制
阿新 • • 發佈:2018-11-15
這裡主要是結合Event Loop
來談JS程式碼是如何執行的。
讀這部分的前提是已經知道了JS引擎是單執行緒,而且這裡會用到前面說的的幾個概念:(如果不是很理解,可以回頭溫習)
-
JS引擎執行緒
-
事件觸發執行緒【輪訓】
-
定時觸發器執行緒
然後再理解一個概念:
-
JS分為同步任務和非同步任務
-
同步任務都在主執行緒上執行,形成一個
執行棧
-
主執行緒之外,事件觸發執行緒管理著一個
任務佇列
,只要非同步任務有了執行結果,就在任務佇列
之中放置一個事件【回撥方法】。 -
一旦
執行棧
中的所有同步任務執行完畢(此時JS引擎空閒),系統就會讀取任務佇列
-
看到這裡,應該就可以理解了:為什麼有時候setTimeout推入的事件不能準時執行?因為可能在它推入到事件列表時,主執行緒還不空閒,正在執行其它程式碼,
所以自然有誤差。
再重複一下:
-
主執行緒執行時會產生執行棧,
棧中的程式碼呼叫某些api時,它們會在事件佇列中新增各種事件(當滿足觸發條件後,如ajax請求完畢)
-
而棧中的程式碼執行完畢,就會讀取事件佇列中的事件,去執行那些回撥
-
如此迴圈
-
注意,總是要等待棧中的程式碼執行完畢後才會去讀取事件佇列中的事件