瀏覽器工做原理(三):js運行機制及Event Loop

參考:http://www.javashuo.com/article/p-apnenkgt-db.htmlsegmentfault

1、爲何有Event Loop

Javascript設計之初就是一門單線程語言,Event Loop就是爲了解決主線程不阻塞的問題。瀏覽器

2、Event Loop流程

一、js中有同步任務、異步任務兩種數據結構

二、同步任務在JS引擎線程執行,造成執行棧異步

三、異步任務在已有異步操做結果符合觸發條件時,進入任務隊列(由事件觸發線程管理)等待執行oop

四、執行棧中的任務運行完成後(JS引擎空閒),從任務隊列中讀取任務,加入到執行棧,並執行spa

3、圖解流程、數據結構、與瀏覽器各線程之間關係

 4、定時器

一、定時器是獨立線程控制:線程

定時觸發是由定時器線程控制的,這是由於JavaScript引擎是單線程的, 若是處於阻塞線程狀態就會影響記計時的準確,所以頗有必要單獨開一個線程用來計時。設計

二、定時器實現流程blog

定時器實如今預先設定的時間後,將事件推入任務隊列,等待執行棧執行。因爲定時事件在推入任務隊列中時,JS引擎線程正在執行其餘任務,這時要定時事件要等待JS引擎線程空閒才能執行,就可能出現定時事件不能準時執行隊列

三、對於0毫秒的定時:

W3C在HTML標準中規定,規定要求setTimeout中低於4ms的時間間隔算爲4ms,但不排除不一樣瀏覽器最小事件設置不一樣。

即使時間間隔爲0也須要進入任務隊列等待JS引擎線程空閒的過程,執行棧中的任務仍是早於定時任務執行

相關文章
相關標籤/搜索