瀏覽器 Event Loop 是 HTML 中定義的規(guī)范
Javascript 有一個(gè) main thread 主線程和 call-stack 調(diào)用棧(執(zhí)行棧)允趟,所有的任務(wù)都會(huì)被放到調(diào)用棧等待主線程執(zhí)行。
JS 調(diào)用棧
JS 調(diào)用棧是一種后進(jìn)先出的數(shù)據(jù)結(jié)構(gòu)盛垦。當(dāng)函數(shù)被調(diào)用時(shí)棕诵,會(huì)被添加到棧中的頂部裁良,執(zhí)行完成之后就從棧頂部移出該函數(shù),直到棧內(nèi)被清空校套。
同步任務(wù)价脾、異步任務(wù)
JavaScript 單線程中的任務(wù)分為同步任務(wù)和異步任務(wù)。同步任務(wù)會(huì)在調(diào)用棧中按照順序排隊(duì)等待主線程執(zhí)行笛匙,異步任務(wù)則會(huì)在異步有了結(jié)果后將注冊(cè)的回調(diào)函數(shù)添加到任務(wù)隊(duì)列(消息隊(duì)列)中等待主線程空閑的時(shí)候侨把,也就是棧內(nèi)被清空的時(shí)候犀变,被讀取到棧中等待主線程執(zhí)行。任務(wù)隊(duì)列是先進(jìn)先出的數(shù)據(jù)結(jié)構(gòu)秋柄。
Event Loop
調(diào)用棧中的同步任務(wù)都執(zhí)行完畢获枝,棧內(nèi)被清空了,就代表主線程空閑了骇笔,這個(gè)時(shí)候就會(huì)去任務(wù)隊(duì)列中按照順序讀取一個(gè)任務(wù)放入到棧中執(zhí)行省店。每次棧內(nèi)被清空,都會(huì)去讀取任務(wù)隊(duì)列有沒有任務(wù)笨触,有就讀取執(zhí)行懦傍,一直循環(huán)讀取-執(zhí)行的操作,就形成了事件循環(huán)芦劣。