溫馨提示×

溫馨提示×

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

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

JavaScript中怎么實現(xiàn)事件循環(huán)

發(fā)布時間:2021-07-01 16:45:20 來源:億速云 閱讀:242 作者:Leah 欄目:web開發(fā)

今天就跟大家聊聊有關(guān)JavaScript中怎么實現(xiàn)事件循環(huán),可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

1.Main.js 執(zhí)行

JavaScript中怎么實現(xiàn)事件循環(huán)

2.調(diào)用secondFunction

JavaScript中怎么實現(xiàn)事件循環(huán)

3.調(diào)用secondFunction引起調(diào)用firstFunction

JavaScript中怎么實現(xiàn)事件循環(huán)

4.執(zhí)行firstFunction,輸出“I'm  first!”,接著由于firstFunction執(zhí)行完畢,firstFunction會從調(diào)用棧中彈出。

JavaScript中怎么實現(xiàn)事件循環(huán)

5.secondFunction繼續(xù)執(zhí)行,輸出“I'm  second!”。接著由于secondFunction執(zhí)行完畢,secondFunction從調(diào)用棧中彈出。

JavaScript中怎么實現(xiàn)事件循環(huán)

6.***,main.js執(zhí)行完畢,也從棧中彈出。

JavaScript中怎么實現(xiàn)事件循環(huán)

Event Loop:事件循環(huán)

了解了call stack在JavaScript引擎中是如何工作了之后,來看下如何使用異步回調(diào)函數(shù)來避免blocking  代碼。(譯者注:回調(diào)函數(shù)有多種實現(xiàn)方式,最常見的有:在函數(shù)中使用函數(shù)作用參數(shù)etc。)setTimeout就是使用的回調(diào)函數(shù)??磦€栗子:

/* Within main.js */  var firstFunction = function () {    console.log("I'm first!"); };  var secondFunction = function () {    setTimeout(firstFunction, 5000);  console.log("I'm second!"); };  secondFunction();  /* Results:  * => I'm second!  * (And 5 seconds later)  * => I'm first!  */

下邊模擬調(diào)用棧(在上個栗子的基礎(chǔ)上我們這次推前點)

1....

2.secondFunction調(diào)用setTimeout,setTimeout入棧:

JavaScript中怎么實現(xiàn)事件循環(huán)

3.setTimeout執(zhí)行后,瀏覽器會把setTimeout的回調(diào)函數(shù)(在這個栗子中是firstFunction)放到Event Table中。Event  Table 就是個注冊站:調(diào)用棧讓Event Table注冊一個函數(shù),該函數(shù)會在5秒之后被調(diào)用。當(dāng)指定的事情發(fā)生時,Event  Table會將這個函數(shù)移到Event Queue。Event Queue其實就是個緩沖區(qū)域,這里的函數(shù)等著被調(diào)用并移到調(diào)用棧。

問題來了,什么時候函數(shù)會從Event Queue移到調(diào)用棧咧?JavaScript引擎依據(jù)一條規(guī)則:有一個monitoring  process(不知翻譯成啥好)會持續(xù)不斷地檢查調(diào)用棧是否為空,一旦為空,它會檢查Event  Queue里邊是否有等待被調(diào)用的函數(shù)。如果存在,它就會調(diào)用這個Queue中***個函數(shù)并將其移到調(diào)用棧中。如果Event  Queue為空,那么這個monitoring process會繼續(xù)不定期的檢查。這一整個過程就是Event Loop。

JavaScript中怎么實現(xiàn)事件循環(huán)

4.一旦回調(diào)函數(shù)加入到Event表中,代碼不會被block住,瀏覽器不會等待5秒之后再繼續(xù)處理接下去的代碼,相反,瀏覽器繼續(xù)執(zhí)行secondFunction的下一行代碼,console.log。

JavaScript中怎么實現(xiàn)事件循環(huán)

5.在background,Event Table會持續(xù)地監(jiān)測是否有事件觸發(fā),將函數(shù)移到Event  Queue中。在這個栗子中,secondFunction執(zhí)行完畢,接著main.js也執(zhí)行完畢。

JavaScript中怎么實現(xiàn)事件循環(huán)

6.從回調(diào)函數(shù)被放入Event Table后5秒鐘,Event Table把firstFucntion移到Event Queue中。

JavaScript中怎么實現(xiàn)事件循環(huán)

7.由于事件循環(huán)持續(xù)地監(jiān)測調(diào)用棧是否已空,此時它一注意到調(diào)用??樟耍驼{(diào)用firstFunction并創(chuàng)建一個新的調(diào)用棧。

JavaScript中怎么實現(xiàn)事件循環(huán)

8.一旦firstFunction執(zhí)行完畢,調(diào)用??樟?,Event Table里也沒有注冊函數(shù),Event Queue也為空。

JavaScript中怎么實現(xiàn)事件循環(huán)

看完上述內(nèi)容,你們對JavaScript中怎么實現(xiàn)事件循環(huán)有進一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。

向AI問一下細節(jié)

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

AI