今天就跟大家聊聊有關(guān)JavaScript中怎么實(shí)現(xiàn)事件循環(huán),可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對這個(gè)行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長期合作伙伴,公司提供的服務(wù)項(xiàng)目有:域名注冊、網(wǎng)絡(luò)空間、營銷軟件、網(wǎng)站建設(shè)、鄂托克前網(wǎng)站維護(hù)、網(wǎng)站推廣。
1.Main.js 執(zhí)行
2.調(diào)用secondFunction
3.調(diào)用secondFunction引起調(diào)用firstFunction
4.執(zhí)行firstFunction,輸出“I'm first!”,接著由于firstFunction執(zhí)行完畢,firstFunction會(huì)從調(diào)用棧中彈出。
5.secondFunction繼續(xù)執(zhí)行,輸出“I'm second!”。接著由于secondFunction執(zhí)行完畢,secondFunction從調(diào)用棧中彈出。
6.***,main.js執(zhí)行完畢,也從棧中彈出。
Event Loop:事件循環(huán)
了解了call stack在JavaScript引擎中是如何工作了之后,來看下如何使用異步回調(diào)函數(shù)來避免blocking 代碼。(譯者注:回調(diào)函數(shù)有多種實(shí)現(xiàn)方式,最常見的有:在函數(shù)中使用函數(shù)作用參數(shù)etc。)setTimeout就是使用的回調(diào)函數(shù)??磦€(gè)栗子:
/* 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)用棧(在上個(gè)栗子的基礎(chǔ)上我們這次推前點(diǎn))
1....
2.secondFunction調(diào)用setTimeout,setTimeout入棧:
3.setTimeout執(zhí)行后,瀏覽器會(huì)把setTimeout的回調(diào)函數(shù)(在這個(gè)栗子中是firstFunction)放到Event Table中。Event Table 就是個(gè)注冊站:調(diào)用棧讓Event Table注冊一個(gè)函數(shù),該函數(shù)會(huì)在5秒之后被調(diào)用。當(dāng)指定的事情發(fā)生時(shí),Event Table會(huì)將這個(gè)函數(shù)移到Event Queue。Event Queue其實(shí)就是個(gè)緩沖區(qū)域,這里的函數(shù)等著被調(diào)用并移到調(diào)用棧。
問題來了,什么時(shí)候函數(shù)會(huì)從Event Queue移到調(diào)用棧咧?JavaScript引擎依據(jù)一條規(guī)則:有一個(gè)monitoring process(不知翻譯成啥好)會(huì)持續(xù)不斷地檢查調(diào)用棧是否為空,一旦為空,它會(huì)檢查Event Queue里邊是否有等待被調(diào)用的函數(shù)。如果存在,它就會(huì)調(diào)用這個(gè)Queue中***個(gè)函數(shù)并將其移到調(diào)用棧中。如果Event Queue為空,那么這個(gè)monitoring process會(huì)繼續(xù)不定期的檢查。這一整個(gè)過程就是Event Loop。
4.一旦回調(diào)函數(shù)加入到Event表中,代碼不會(huì)被block住,瀏覽器不會(huì)等待5秒之后再繼續(xù)處理接下去的代碼,相反,瀏覽器繼續(xù)執(zhí)行secondFunction的下一行代碼,console.log。
5.在background,Event Table會(huì)持續(xù)地監(jiān)測是否有事件觸發(fā),將函數(shù)移到Event Queue中。在這個(gè)栗子中,secondFunction執(zhí)行完畢,接著main.js也執(zhí)行完畢。
6.從回調(diào)函數(shù)被放入Event Table后5秒鐘,Event Table把firstFucntion移到Event Queue中。
7.由于事件循環(huán)持續(xù)地監(jiān)測調(diào)用棧是否已空,此時(shí)它一注意到調(diào)用??樟?,就調(diào)用firstFunction并創(chuàng)建一個(gè)新的調(diào)用棧。
8.一旦firstFunction執(zhí)行完畢,調(diào)用??樟耍珽vent Table里也沒有注冊函數(shù),Event Queue也為空。
看完上述內(nèi)容,你們對JavaScript中怎么實(shí)現(xiàn)事件循環(huán)有進(jìn)一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。