JS中的執行機制(setTimeout、setInterval、promise、宏任務、微任務)


1、執行機制

JS 是單線程的,處理 JS 任務(程序)只能一個一個順序執行,所以 JS 中就把任務分為了同步任務和異步任務。同步的進入主線程先執行,異步的進入Event Table並注冊函數,當指定的事情完成時,Event Table會將這個函數移入事件隊列Event Queue,等待主線程內的任務執行完畢,然后就會從事件隊列 Event Queue 中讀取對應的函數,進入主線程執行。

除了廣義的同步任務和異步任務,JS 對任務還有更精細的定義:

  • macro-task(宏任務):包括整體代碼script,setTimeout,setInterval
  • micro-task(微任務):Promise,process.nextTick

微任務先於宏任務執行(除了一開始的整體代碼 script)。執行過程中,不同類型的任務會進入對應的事件隊列Event Queue,比如setTimeoutsetInterval會進入相同的Event Queue。

1.1、執行優先級

  • 同步代碼執行順序優先級高於異步代碼執行順序優先級
  • process.nextTick() > Promise.then() > setTimeout > setImmediate

(注意:process.nextTick 是 node 中的方法,而在瀏覽器中執行時(比如在vue項目中),會退化成setTimeout,所以在瀏覽器中 process.nextTick 會比 Promise.then() 慢)

1.2、總結

總得來說,在 JS 中,先是執行整體的同步任務代碼,遇到微任務就會將其放在微任務事件隊列,遇到宏任務就會放在宏任務事件隊列中。

然后整體的同步任務代碼執行完后,就會先執行微任務隊列中的任務,等待微任務隊列中的所有任務執行完畢后,此時才會從宏任務隊列中找到第一個任務進行執行。該任務執行過程中,如果遇到微任務就會放到微任務隊列中,等到該任務執行完后,就會查看微任務隊列中有沒有微任務,如果有就先執行完微隊列中的任務,否則執行第二個宏任務。以此類推。

詳細參考:https://juejin.im/post/59e85eebf265da430d571f89


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM