1. 程式人生 > >從Event Loop談JS的執行機制

從Event Loop談JS的執行機制

這裡主要是結合Event Loop來談JS程式碼是如何執行的。

 

讀這部分的前提是已經知道了JS引擎是單執行緒,而且這裡會用到前面說的的幾個概念:(如果不是很理解,可以回頭溫習)

  • JS引擎執行緒

  • 事件觸發執行緒【輪訓】

  • 定時觸發器執行緒

然後再理解一個概念:

  • JS分為同步任務和非同步任務

  • 同步任務都在主執行緒上執行,形成一個執行棧

  • 主執行緒之外,事件觸發執行緒管理著一個任務佇列,只要非同步任務有了執行結果,就在任務佇列之中放置一個事件【回撥方法】。

  • 一旦執行棧中的所有同步任務執行完畢(此時JS引擎空閒),系統就會讀取任務佇列

    ,將可執行的非同步任務新增到可執行棧中,開始執行。

  •  

看到這裡,應該就可以理解了:為什麼有時候setTimeout推入的事件不能準時執行?因為可能在它推入到事件列表時,主執行緒還不空閒,正在執行其它程式碼,
所以自然有誤差。

 

再重複一下:

 

  • 主執行緒執行時會產生執行棧,

棧中的程式碼呼叫某些api時,它們會在事件佇列中新增各種事件(當滿足觸發條件後,如ajax請求完畢)

  • 而棧中的程式碼執行完畢,就會讀取事件佇列中的事件,去執行那些回撥

  • 如此迴圈

  • 注意,總是要等待棧中的程式碼執行完畢後才會去讀取事件佇列中的事件