瀏覽器內(nèi)核分為兩種:渲染引擎和js引擎胆绊。
渲染引擎:負責(zé)網(wǎng)頁內(nèi)容(html/xml/圖像)间影,整理訊息(例如加入css)鹰贵,以及網(wǎng)頁的顯示方式晴氨,內(nèi)核不同,頁面展示方式也不同碉输。
js引擎:是解析javascript語言籽前,執(zhí)行js語言實現(xiàn)頁面的動態(tài)效果。
最開始渲染引擎和js引擎并沒有很嚴格的區(qū)分,后來js引擎越來越獨立聚假,內(nèi)核則傾向于只指渲染引擎块蚌,內(nèi)核的種類很多,常見的內(nèi)核有四種:Trident / Gecko / Blink / Webkit
Trident內(nèi)核
俗稱IE內(nèi)核膘格,老得Triden內(nèi)核(Ie6)當(dāng)年市場份額很大峭范,所以大量的網(wǎng)頁時專門為老Trident內(nèi)核編寫,但是這些代碼并不符合w3c規(guī)范瘪贱。于是符合w3c規(guī)范標準的網(wǎng)頁在老Trident內(nèi)核下出現(xiàn)了偏差纱控。
之后新的Trident內(nèi)核被Ie9使用,對w3c的標準支持好了很多菜秦。
相關(guān)瀏覽器:
ie6,ie7,ie8(Trident4.0) ie9(Trident 5.0) ie10(Trident 6.0)
世界之窗甜害,360瀏覽器(Trident+chrome內(nèi)核) 遨游2.0(3.0開始使用webkit內(nèi)核)
Gecko內(nèi)核
基于Gecko內(nèi)核的瀏覽器并不多見,出了一些簡單的改動和重新編譯球昨,深度定制的還是很少見尔店。
相關(guān)瀏覽器:
fireFox
webkit內(nèi)核
由khtml內(nèi)核發(fā)展而來,遵守w3c標準主慰。
相關(guān)瀏覽器:
safari / chrome( 以前是webkit嚣州,現(xiàn)在是Blink) / android 默認瀏覽器
Blink內(nèi)核
google開發(fā),chrome的內(nèi)核是由webkit內(nèi)核改為Blink內(nèi)核共螺。
相關(guān)瀏覽器:
chrome
js引擎
js引擎執(zhí)行機制
前提该肴,請先記住兩點:
1.js是單線程的。
2.js event loop 就是js引擎的執(zhí)行機制藐不。
任務(wù)隊列
單線程就意味著匀哄,所有的任務(wù)需要排隊處理。當(dāng)前一個任務(wù)結(jié)束后雏蛮,才能執(zhí)行下一個任務(wù)涎嚼,如果前一個任務(wù)消耗了很長時間,那下一個任務(wù)就只能一直等著底扳。
于是
所有任務(wù)分為兩種:1.同步任務(wù)铸抑。2.異步任務(wù)。
同步任務(wù):指的是在主線程上排隊執(zhí)行的任務(wù)衷模,只有前一個任務(wù)結(jié)束鹊汛,才執(zhí)行下一個任務(wù)。
異步任務(wù):不進入主線程阱冶,而是進入任務(wù)隊列(task queue)刁憋,只有task queue 通知主線程,某個異步任務(wù)可以執(zhí)行了木蹬,才回被放到主線程執(zhí)行至耻。
js引擎執(zhí)行機制如下:
(1)所有同步任務(wù)都在主線程上,形成一個執(zhí)行棧。
(2) 主線程外尘颓,還有一個task queue走触,只要異步任務(wù)有了運行結(jié)果,就在task queue中放置一個事件疤苹。
(3)當(dāng)執(zhí)行棧所有同步任務(wù)之行結(jié)束后互广,系統(tǒng)會讀取 task queue,看看里面有哪些事件卧土,于是這些異步任務(wù)惫皱,結(jié)束等待狀態(tài),進入執(zhí)行棧尤莺,開始執(zhí)行旅敷。
(4)主線程不斷重復(fù)第三步。