溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

詳解JavaScript中Event Loop相關(guān)原理

發(fā)布時間:2020-07-17 11:15:32 來源:億速云 閱讀:224 作者:小豬 欄目:web開發(fā)

小編這次要給大家分享的是詳解JavaScript中Event Loop相關(guān)原理,文章內(nèi)容豐富,感興趣的小伙伴可以來了解一下,希望大家閱讀完這篇文章之后能夠有所收獲。

1.單線程模型

單線程模型指的是,JavaScript只能在一個線程上運行,也就是說只能同時指向一個任務(wù),其他任務(wù)都必須在后面排隊等待。注意:雖然JavaScript只在一個線程上運行,但并不代碼JavaScript引擎只有一個線程。事實上,JavaScript引擎有多個線程,單個腳本只能在一個線程上運行(主線程),其他線程都是在后臺配合。

詳解JavaScript中Event Loop相關(guān)原理

JavaScript為什么要采用單線程,而不是多線程?

不想讓瀏覽器變得復(fù)雜(避免復(fù)雜性),因為多線程需要共享資源、且可能修改彼此運行的結(jié)果。

該模式會導(dǎo)致的問題?

如果單個任務(wù)耗時長,會拖延整個程序的執(zhí)行,可能導(dǎo)致瀏覽器無響應(yīng)(假死)

JavaScript是如何解決這個問題的?

因為單線程的原因,CPU很多時候都閑著的,并且因為IO操作(輸入輸出)很慢(比如Ajax操作從網(wǎng)絡(luò)讀取數(shù)據(jù)),這時CPU可以完全不管IO操作,掛起等待中的任務(wù),先運行排在后面的任務(wù)。等到IO操作返回了結(jié)果,再回過頭,把掛起的任務(wù)繼續(xù)執(zhí)行下去。這種機制就是JavaScript內(nèi)部采用的“事件循環(huán)”機制(Event Loop)

2.同步任務(wù)和異步任務(wù)

程序里面所有的任務(wù),可以分成兩類:同步任務(wù)(synchronous)和異步任務(wù)(asynchronous)

同步任務(wù):沒有被引擎掛起、在主線程上排隊執(zhí)行的任務(wù)。只有前一個任務(wù)執(zhí)行完畢,才能執(zhí)行后一個任務(wù)。

異步任務(wù):被引擎放一邊、不進(jìn)行主線程、而進(jìn)入任務(wù)隊列的任務(wù)。只有引擎認(rèn)為某個異步任務(wù)可以執(zhí)行了(比如Ajax操作從服務(wù)器得到了結(jié)果),那么該任務(wù)(通過回調(diào)函數(shù)的形式)才能進(jìn)入主線程執(zhí)行。排在異步任務(wù)后面的代碼,不用等到異步任務(wù)結(jié)束就會馬上運行,也就是說,異步任務(wù)不具有“堵塞”效應(yīng)

3.任務(wù)隊列和事件循環(huán)

JavaScript運行時,除了一個正在運行的主線程(又稱為“調(diào)用棧(call stack)”),引擎還提供了一個任務(wù)隊列(task queue),里面是各種需要處理當(dāng)前程序處理的異步任務(wù)。(實際上,根據(jù)異步任務(wù)的類型,存在多個任務(wù)隊列,后面再詳講)

詳解JavaScript中Event Loop相關(guān)原理

1.主線程會去執(zhí)行所有的同步任務(wù)。

2.等到同步任務(wù)全部執(zhí)行完,查看任務(wù)隊列中的異步任務(wù),將滿足條件的重新進(jìn)入主線程開始執(zhí)行,這時候就變成同步任務(wù)。

3.等任務(wù)執(zhí)行完,下一個異步任務(wù)再進(jìn)入主線程開始執(zhí)行。

4.引擎不停檢查(“事件循環(huán)”),一旦任務(wù)隊列清空,程序就結(jié)束執(zhí)行。

看完這篇關(guān)于詳解JavaScript中Event Loop相關(guān)原理的文章,如果覺得文章內(nèi)容寫得不錯的話,可以把它分享出去給更多人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI