什麼是EventLoop?
js為什麼是單執行緒
js採用單執行緒,和js的用途相關,js主要是用來操作瀏覽器中的dom元素;
想像一下,如果js是多執行緒,不同的執行緒對同一個dom進行操作,一方面會增加瀏覽器渲染的複雜度;另一方面會造成瀏覽器的混亂,不知道如何是好??
所以js採用單執行緒的方式,之後也不會進行改變
複製程式碼
任務佇列
單執行緒的執行方式,意味著所有的任務都會在同一個主執行緒上面進行排隊執行,形成了任務佇列
js程式碼可以分為同步與非同步程式碼,所以相應的會形成同步任務與非同步任務,所謂的非同步不會阻塞主執行緒,會等主執行緒的任務完成之後,再行執行
EventLoop
瀏覽器為了提高效率,模擬多執行緒管理方式,在同步任務執行完畢之後,透過EventLoop方式取得非同步任務執行,就形成了EventLoop
主執行棧

如圖所示,js中的記憶體分為 堆記憶體(heap) 和 棧記憶體(stack), 堆記憶體 中存的是我們宣告的object型別的資料,棧記憶體中存的是基本資料型態以及 函式執行時的執行空間。我們的同步程式碼就放在執行棧 中,即主執行棧;那非同步程式碼呢?瀏覽器會將 dom事件 ajax setTimeout等非同步程式碼放到佇列中,等待執行棧中的程式碼都執行完畢,才會執行佇列中的程式碼。
非同步佇列
非同步程式碼存放的佇列,但非同步佇列的執行也分為巨集任務與微任務
巨集任務
巨集任務包括setTimeOut、setInterval
等待執行棧和微任務佇列都執行完畢才會執行,並且在執行完每一個巨集任務之後,會去看看微任務佇列有沒有新新增的任務,如果有,會先將微任務佇列中的任務清空,才會繼續執行下一個巨集任務
微任務
微任務包括Promise
當執行棧中的程式碼執行完畢,會在執行巨集任務佇列之前先看看微任務佇列中有沒有任務,如果有會先將微任務佇列中的任務清空才會去執行巨集任務佇列
程式碼執行的次序為:主執行棧 > 微任務 > 巨集任務
舉個??
setTimeout(() => {
console.log('timeout1')
Promise.resolve().then(() => {
console.log('promise1')
})
Promise.resolve().then(() => {
console.log('promise2')
})
}, 100)
setTimeout(() => {
console.log('timeout2')
Promise.resolve().then(() => {
console.log('promise3')
})
}, 200)
複製程式碼
輸出結果:timeout1 promise1 promise2 timeout2 promise3
nodejs的EventLoop
nodejs中的執行機制,和上述瀏覽器中的執行機制有差異;和node的版本也有關係,等著下次再進行學習
參考連結
www.ruanyifeng.com/blog/2014/1…
juejin.im/post/5b63b4…

關於找一找教學網
本站文章僅代表作者觀點,不代表本站立場,所有文章非營利性免費分享。
本站提供了軟體程式設計、網站開發技術、伺服器運維、人工智慧等等IT技術文章,希望廣大程式設計師努力學習,讓我們用科技改變世界。
[JavaScript執行機制—EventLoop]http://www.zyiz.net/tech/detail-142391.html