javascript引擎單執行緒程式,其執行同步操作會按順序向下執行,執行非同步操作則使用事件迴圈模型。
js引擎執行緒遇到非同步操作,會將非同步操作交給對應的觀察者,
非同步操作包括:
dom事件 click,mousedown等
定時器 setTimeout,setInterval
IO 網路IO,檔案IO,其他IO(localStorage,cookie),IO操作會交給對應的執行緒池來執行
觀察者觀察非同步操作的狀態,在非同步操作執行完成,會將對應的非同步資訊(包括callback等)封裝成事件推入事件佇列。
js引擎執行緒會不斷的輪詢事件佇列,按照先進先出的原則讀取事件,若有事件,則取出,並執行其callback,執行一次callback的過程稱為一次迴圈(Tick),
執行完成,進入下一次迴圈(nextTick)。
若事件佇列為空,則js引擎執行空迴圈。
在瀏覽器中,js引擎與GUI引擎是互斥的,即js引擎會阻塞UI渲染,當js同步持續執行的時候,UI不會更新,會處於卡死狀態。