爲何會有消息隊列和事件循環呢?首先最關鍵的一點在於JS是個單線程,而且主線程很是繁忙,既要處理 DOM,又要計算樣式,還要處理佈局,同時還須要處理 JavaScript 任務以及各類輸入事件。要讓這麼多不一樣類型的任務在主線程中有條不紊地執行,這就須要一個系統來統籌調度這些任務,這個統籌調度系統就是消息隊列和事件循環系統。瀏覽器
消息隊列是一種數據結構,能夠存放要執行的任務。它符合隊列「先進先出」的特色,也就是說要添加任務的話,添加到隊列的尾部;要取出任務的話,從隊列頭部去取。數據結構
在線程運行過程當中,接收並執行新的任務,就須要採用事件循環機制。佈局
添加了微任務隊列來解決,一般咱們把消息隊列中的任務稱爲宏任務,每一個宏任務中都包含了一個微任務隊列,在執行宏任務的過程當中,若是DOM有變化,那麼就會將該變化添加到微任務列表中,這樣就不會影響到宏任務的繼續執行,所以也就解決了執行效率的問題。等宏任務中的主要功能都直接完成以後,這時候,渲染引擎並不着急去執行下一個宏任務,而是執行當前宏任務中的微任務,由於 DOM 變化的事件都保存在這些微任務隊列中,這樣也就解決了實時性問題。spa
JavaScript 能夠經過回調功能來規避這種問題,也就是讓要執行的 JavaScript 任務滯後執行。線程
參考3d
瀏覽器工做原理與實踐cdn