今天就跟大家聊聊有關(guān)JavaScript中怎么實(shí)現(xiàn)事件循環(huán),可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對(duì)這個(gè)行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡(jiǎn)單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:域名注冊(cè)、網(wǎng)絡(luò)空間、營(yíng)銷軟件、網(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è)注冊(cè)站:調(diào)用棧讓Event Table注冊(cè)一個(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)測(cè)是否有事件觸發(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)測(cè)調(diào)用棧是否已空,此時(shí)它一注意到調(diào)用??樟?,就調(diào)用firstFunction并創(chuàng)建一個(gè)新的調(diào)用棧。
8.一旦firstFunction執(zhí)行完畢,調(diào)用棧空了,Event Table里也沒有注冊(cè)函數(shù),Event Queue也為空。
看完上述內(nèi)容,你們對(duì)JavaScript中怎么實(shí)現(xiàn)事件循環(huán)有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。
分享標(biāo)題:JavaScript中怎么實(shí)現(xiàn)事件循環(huán)
網(wǎng)站地址:http://jinyejixie.com/article12/jjjpdc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)、App設(shè)計(jì)、標(biāo)簽優(yōu)化、微信小程序、營(yíng)銷型網(wǎng)站建設(shè)、品牌網(wǎng)站設(shè)計(jì)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)