- js引擎運行的環(huán)境就是宿主環(huán)境,通常就是Web瀏覽器、node
- js引擎提供一種機制來處理分塊執(zhí)行的代碼,這種機制就是事件循環(huán):
事件循環(huán)偽代碼:
var eventLoop = []; // eventLoop 作為隊列的數(shù)據(jù),存儲待執(zhí)行的事件
var event; // 當前要處理的事件
while(true){
// 一次tick
if(eventLoop.length > 0){
event = eventLoop.shift()
try{
// 執(zhí)行當前事件
event()
} catch (err){
// 錯誤上報
reportError(err)
}
}
}
- setTimeout()為什么不精準?
因為setTimeout并沒有把你的回調(diào)函數(shù)掛在事件循環(huán)中。作為一個定時器,當設定時間到達后,環(huán)境才把你的回調(diào)函數(shù)放入事件循環(huán)中。這時候你的事件隊列可能很長了,所以這個回調(diào)執(zhí)行的時間完全依賴事件隊列的狀態(tài)決定。