- 如何理解JS 的單線程?
- 單線程: JS 在運行的時候,同一時間只能做一件事兒
- setTimeout是一個異步任務,console.log是同步任務
- 什么是任務隊列?
-
單線程任務隊列:單線程任務隊列是有優(yōu)先順序的,在任務里是有同步任務和異步任務,同步任務執(zhí)行的優(yōu)先級是高于異步的
?
for (var i = 0;i < 4;i++) { setTimeout(function() { console.log(i) },1000) } //打印出4個4
?
異步隊列執(zhí)行的時間(異步任務的放入時間和執(zhí)行時間),瀏覽器有一個執(zhí)行 setTimeout 和 setInterval 的 panel ,它是到了那個時間才會把那個語句放到異步隊列的過程中,我這個for 循環(huán)在執(zhí)行過程中,遇到setTimeout 了,這個地方是1000,那么定時器會記錄這個語句,然后它并沒有去執(zhí)行,i 就加1了,然后還是沒有執(zhí)行,只是交給定時器模塊了,這個時候for 循環(huán)體在執(zhí)行的過程中,并沒有真正放到異步隊列中去,按照剛才講的,for 循環(huán)體執(zhí)行完了就會去執(zhí)行異步隊列,也就是說依次執(zhí)行setTimeout,但其實這個時候異步執(zhí)行隊列中是沒有setTimeout的,因為它沒有到時間,4個循環(huán)體執(zhí)行是非常塊的,可能不到1ms就執(zhí)行完了,它執(zhí)行完了異步隊列里并沒有東西,只有當這個時間到了,定時器會把setTimeout 函數(shù)體扔到異步隊列中,異步隊列在等待一個叫事件循環(huán)的東西來執(zhí)行,可以理解為現(xiàn)在到時間了,扔到異步隊列了,異步隊列就可以執(zhí)行了
- 什么是 Event loop?