一、事件循環(huán)
JavaScript是單線程,同一個時間只能做一件事情,所以執(zhí)行任務(wù)需要排隊。如果前一個耗時很長,那么下一個只能等待。
1)兩種任務(wù)
為了更好的處理任務(wù),JavaScript語言的設(shè)計者將任務(wù)分為兩種:同步任務(wù)(synchronous)與異步任務(wù)(asynchronous)。
同步任務(wù):在主線程上排隊執(zhí)行的任務(wù)。
異步任務(wù):放在“任務(wù)隊列”(task queue)中,只有當(dāng)主線程空了,才會將“任務(wù)隊列”中的任務(wù)放到主線程中。
這就是JavaScript的運(yùn)行機(jī)制,這個過程會不斷重復(fù),這個機(jī)制叫事件循環(huán)(Event Loop)。
2)事件循環(huán)
事件循環(huán)模型可以用下圖描述,圖片來自Philip Roberts的演講《Help, I’m stuck in an event loop》:
1. “WebAPIs”內(nèi)的就是異步任務(wù),包括DOM事件、Ajax和setTimeout。
2. “callback queue”內(nèi)的是一個任務(wù)隊列,包括click、load、done。