門戶網站建設及運營品牌傳播推廣方案
宏任務微任務
- 一、為什么JS是單線程語言?
- 二、JS是單線程,怎樣執(zhí)行異步代碼?
1、JS是單線程語言
2、JS代碼執(zhí)行流程,同步執(zhí)行完,再進行事件循環(huán)(微任務、宏任務) 3、清空所有的微任務,再執(zhí)行宏任務
4、微任務:Promise.then 5、宏任務:setTimeout
事件循環(huán):微任務、宏任務
向服務器發(fā)送的請求、定時器、事件 都會進入事件循環(huán)
一、為什么JS是單線程語言?
JS語言的一大特點就是單線程,也就是說,同一時間只能做一件事,那么,JS為什么不能有多個線程呢?這樣能提高效率啊。
JS的單線程,與它的用途有關,作為瀏覽器腳本語言,JS的主要用途是與用戶互動,以及操作DOM,這決定了它只能是單線程,否則會帶來很復雜的同步問題,比如,假定JS同時有兩個線程,一個線程在某個DOM節(jié)點上添加內容,另一個線程刪除了這個節(jié)點,這時瀏覽器應該以哪個線程為準?
所以,為了避免復雜性,從一誕生,JS就是單線程,這已經成為了這門語言的核心特征,將來也不會改變。
二、JS是單線程,怎樣執(zhí)行異步代碼?
單線程就意味著,所有任務需要排隊,前一個任務結束,才會執(zhí)行后一個任務,如果前一個任務耗時很長,后一個任務就不得不一直等著。
消息隊列:消息隊列是一個先進先出的隊列,它里面存放著各種消息
事件循環(huán):事件循環(huán)是指主線程重復從消息隊列中取消息,執(zhí)行的過程。
實際上,主線程只會做一件事,就是從消息隊列里取消息,執(zhí)行消息,再取消息,再執(zhí)行,當消息隊列為空時,就會等待直到消息隊列變成非空,而且主線程只有在將當前的消息執(zhí)行完后,才會去取下一個消息,這種機制就叫做事件循環(huán)機制,取一個消息并執(zhí)行
題目:
答案:
3
3
3分析:
1、for循環(huán)進入同步任務
2、setTimeout進入事件循環(huán)
3、先執(zhí)行同步任務,執(zhí)行完同步,執(zhí)行事件循環(huán)所以: for循環(huán)里面的i到3了,才開始執(zhí)行定時器里面的打印,三個輸出都是3
題目:
答案:
1 promise 1
2
微1
微2
1分析:
同步任務:Promise內部、console.log(2)
微任務:Promise.then
宏任務:setTimeout
先執(zhí)行同步去任務 :
1、Promise內部的:1 promise 1
2、console.log(2)的:2
進入事件循環(huán),先執(zhí)行微任務:
Promise.then里面的:微1、微2
再執(zhí)行宏任務:
console.log(1): 1