參考:http://www.javashuo.com/article/p-apnenkgt-db.htmlsegmentfault
Javascript設計之初就是一門單線程語言,Event Loop就是爲了解決主線程不阻塞的問題。瀏覽器
一、js中有同步任務、異步任務兩種數據結構
二、同步任務在JS引擎線程執行,造成執行棧異步
三、異步任務在已有異步操做結果符合觸發條件時,進入任務隊列(由事件觸發線程管理)等待執行oop
四、執行棧中的任務運行完成後(JS引擎空閒),從任務隊列中讀取任務,加入到執行棧,並執行spa
一、定時器是獨立線程控制:線程
定時觸發是由定時器線程控制的,這是由於JavaScript引擎是單線程的, 若是處於阻塞線程狀態就會影響記計時的準確,所以頗有必要單獨開一個線程用來計時。設計
二、定時器實現流程blog
定時器實如今預先設定的時間後,將事件推入任務隊列,等待執行棧執行。因爲定時事件在推入任務隊列中時,JS引擎線程正在執行其餘任務,這時要定時事件要等待JS引擎線程空閒才能執行,就可能出現定時事件不能準時執行隊列
三、對於0毫秒的定時:
W3C在HTML標準中規定,規定要求setTimeout中低於4ms的時間間隔算爲4ms,但不排除不一樣瀏覽器最小事件設置不一樣。
即使時間間隔爲0也須要進入任務隊列等待JS引擎線程空閒的過程,執行棧中的任務仍是早於定時任務執行