瀏覽器的渲染進(jìn)程拇涤,包含5個線程
1 、GUI 渲染線程
負(fù)責(zé)瀏覽器頁面渲染誉结,解析html,css,構(gòu)建Dom樹鹅士,構(gòu)建css樹,頁面繪制惩坑;
與JS引擎進(jìn)程互斥掉盅;
2、JS 引擎線程
負(fù)責(zé)解析js腳本以舒,運(yùn)行代碼趾痘,每一個tab頁只有一個js引擎線程執(zhí)行js。如果js線程執(zhí)行時間過長蔓钟,會造成頁面渲染不連貫永票,阻塞頁面渲染
3、事件觸發(fā)線程
用來控制事件循環(huán),當(dāng)js執(zhí)行setTimeout代碼片段等(也可是來自瀏覽器內(nèi)核的其他線程,如鼠標(biāo)點(diǎn)擊侣集、AJAX異步請求等)键俱,會將對應(yīng)任務(wù)放入事件觸發(fā)線程中,當(dāng)對應(yīng)的事件符合觸發(fā)條件時世分,該線程會把對應(yīng)事件放到待處理隊列编振,等待js引擎空閑時處理
4、定時器 觸發(fā)線程 罚攀,即setTimeout党觅, setInterval計時器
瀏覽器計數(shù)并不是js引擎來完成,因?yàn)閖s是單線程的斋泄,如果來完成計數(shù)杯瞻,不能保證計數(shù)的準(zhǔn)確性,所以由專門 定時器線程來進(jìn)行計數(shù)炫掐,并觸發(fā)定時器魁莉,計時完畢后,添加到事件隊列中募胃,等待js引擎空閑時執(zhí)行旗唁。
所以定時器的任務(wù)在設(shè)定的時間點(diǎn)并不一定準(zhǔn)時執(zhí)行,定時器只是在指定的時間點(diǎn)把任務(wù)添加到事件隊列痹束。
5检疫、異步 http請求線程
XMLHttpRequest 連接后通過瀏覽器新開一個 http請求線程,當(dāng)檢測到狀態(tài)變更時祷嘶,如果設(shè)置有回調(diào)函數(shù)屎媳,異常線程就產(chǎn)生狀態(tài)變更事件,把回調(diào)函數(shù)添加到事件隊列中论巍,等待js引擎空閑時執(zhí)行