JS深入(事件循環(huán))

首先要糾正一個(gè)誤區(qū):JS其實(shí)就是一門語(yǔ)言,說(shuō)是單線程還是多線程得結(jié)合具體運(yùn)行環(huán)境(瀏覽器)。


瀏覽器的內(nèi)核是多線程的。

一個(gè)瀏覽器通常由以下幾個(gè)常駐的線程:

渲染引擎線程:顧名思義,該線程負(fù)責(zé)頁(yè)面的渲染

JS引擎線程:負(fù)責(zé)JS的解析和執(zhí)行

定時(shí)觸發(fā)器線程:處理定時(shí)事件,比如setTimeout, setInterval

事件觸發(fā)線程:處理DOM事件

異步http請(qǐng)求線程:處理http請(qǐng)求


JS引擎

負(fù)責(zé)JS代碼的解析和執(zhí)行(注意是瀏覽器自己開(kāi)了一個(gè)線程)。通常包括以下幾個(gè)步驟:

詞法分析:將源代碼分解為有意義的分詞

語(yǔ)法分析:用語(yǔ)法分析器將分詞解析成語(yǔ)法樹(shù)

代碼生成:生成可執(zhí)行代碼(將所有JS代碼全部生成為可執(zhí)行代碼)

函數(shù)調(diào)用棧的更新:遵循代碼順序,不同上下文出入函數(shù)調(diào)用棧。伴隨函數(shù)調(diào)用棧的更新,JS代碼逐句執(zhí)行至尾部。

瀏覽器在運(yùn)行時(shí)只開(kāi)啟了一個(gè)JS引擎線程來(lái)解析和執(zhí)行JS。且要記得無(wú)論是同步還是異步執(zhí)行,JS引擎線程的運(yùn)行始終是非阻塞的,這是在設(shè)計(jì)之初就定下的。


JS異步執(zhí)行

JS引擎的事件循環(huán)機(jī)制是JS實(shí)現(xiàn)異步執(zhí)行的前提。在上下文的不斷切換,函數(shù)調(diào)用棧的更新過(guò)程中,一旦發(fā)現(xiàn)"事件綁定,AJAX,setTimeout/setInterval"等任務(wù),會(huì)把它們會(huì)將其放入消息隊(duì)列中。當(dāng)函數(shù)調(diào)用棧為空時(shí),JS引擎會(huì)執(zhí)行一次循環(huán),將事件隊(duì)列的隊(duì)首出隊(duì)至函數(shù)調(diào)用棧中。

待續(xù)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,111評(píng)論 25 709
  • 從三月份找實(shí)習(xí)到現(xiàn)在,面了一些公司,掛了不少,但最終還是拿到小米、百度、阿里、京東、新浪、CVTE、樂(lè)視家的研發(fā)崗...
    時(shí)芥藍(lán)閱讀 42,814評(píng)論 11 349
  • 1 你離開(kāi)后的第二年,我依然是一個(gè)人。 不管是情長(zhǎng)的還是意短的,時(shí)間多的又或者少的,有感情的沒(méi)感情的,我都沒(méi)有再經(jīng)...
    蘇三怪閱讀 922評(píng)論 14 25
  • 隨著經(jīng)濟(jì)水平的提高,人們對(duì)健康也開(kāi)始重視,越來(lái)越多的人走進(jìn)了健身房,但是我們鍛煉完每一塊肌肉之后都需要給他拉伸一下...
    亞洲形體可可閱讀 1,659評(píng)論 0 0

友情鏈接更多精彩內(nèi)容