Java loop機制_JavaScript執行機制—EventLoop

什麼是EventLoop?

js為什麼是單執行緒

js採用單執行緒,和js的用途相關,js主要是用來操作瀏覽器中的dom元素;

想像一下,如果js是多執行緒,不同的執行緒對同一個dom進行操作,一方面會增加瀏覽器渲染的複雜度;另一方面會造成瀏覽器的混亂,不知道如何是好??

所以js採用單執行緒的方式,之後也不會進行改變

複製程式碼

任務佇列

單執行緒的執行方式,意味著所有的任務都會在同一個主執行緒上面進行排隊執行,形成了任務佇列

js程式碼可以分為同步與非同步程式碼,所以相應的會形成同步任務與非同步任務,所謂的非同步不會阻塞主執行緒,會等主執行緒的任務完成之後,再行執行

EventLoop

瀏覽器為了提高效率,模擬多執行緒管理方式,在同步任務執行完畢之後,透過EventLoop方式取得非同步任務執行,就形成了EventLoop

主執行棧

338668df0c18774c585e1a6522d270ba.png

如圖所示,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…

b739ec46bb5c46d9c0aa4ce35ba1ea56.png

關於找一找教學網

本站文章僅代表作者觀點,不代表本站立場,所有文章非營利性免費分享。

本站提供了軟體程式設計、網站開發技術、伺服器運維、人工智慧等等IT技術文章,希望廣大程式設計師努力學習,讓我們用科技改變世界。

[JavaScript執行機制—EventLoop]http://www.zyiz.net/tech/detail-142391.html