javascript從誕生之日起就是一門 單線程的 非阻塞的 腳本語言,單線程意味着,javascript代碼在執行的任何時候,都只有一個主線程來處理所有的任務,非阻塞靠的就是 event loop(事件循環),本文就講解下事件循環。
event loop它最主要是分三部分:主線程、宏隊列(macrotask)、微隊列(microtask)
js的任務隊列分爲同步任務和異步任務,所有的同步任務都是在主線程裏執行的,異步任務可能會在macrotask或者microtask裏面
主線程
就是訪問到的script標籤裏面包含的內容,或者是直接訪問某一個js文件的時候,裏面的可以在當前作用域直接執行的所有內容(執行的方法,new出來的對象等)
宏隊列(macrotask)
- script(整體代碼)
- setTimeout
- setInterval
- setImmediate
- I/O
- UI render
微隊列(microtask)
- process.nextTick
- Promise
- Async/Await(實際就是promise)
- MutationObserver(html5新特性)
執行順序
1、先執行主線程
2、遇到宏隊列(macrotask)放到宏隊列(macrotask)
3、遇到微隊列(microtask)放到微隊列(microtask)
4、主線程執行完畢
5、執行微隊列(microtask),微隊列(microtask)執行完畢
6、執行一次宏隊列(macrotask)中的一個任務,執行完畢
7、執行微隊列(microtask),執行完畢
8、依次循環。。。