- 資訊首頁(yè) > 開(kāi)發(fā)技術(shù) > 編程語(yǔ)言 >
- JS的執行機制是什么意思
本篇內容主要講解“JS的執行機制是什么意思”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強。下面就讓小編來(lái)帶大家學(xué)習“JS的執行機制是什么意思”吧!
JavaScript是一門(mén)單線(xiàn)程的非阻塞腳本語(yǔ)言,同一時(shí)刻只允許一個(gè)代碼段執行。在單線(xiàn)程的機制下,執行異步任務(wù)時(shí),在等待結果返回的這個(gè)時(shí)間段,后面的代碼就無(wú)法執行了。
JS在執行代碼時(shí),遇到異步任務(wù)之后還有同步任務(wù)的場(chǎng)景時(shí),它并不會(huì )等待異步任務(wù)執行完,而是先執行同步任務(wù),那么JS是如何做到這一點(diǎn)的呢?
本篇文章將詳細講解上述問(wèn)題,歡迎各位感興趣的開(kāi)發(fā)者閱讀本文。
講事件循環(huán)之前,我們先來(lái)理解下為什么JS不設計成多線(xiàn)程的。
我們做個(gè)假設,如果JS是多線(xiàn)程的,因為JS有DOM API可以操作DOM,此時(shí)如果有兩個(gè)線(xiàn)程在操作同一個(gè)DOM,線(xiàn)程1刪除了這個(gè)dom節點(diǎn),線(xiàn)程2要操作這個(gè)dom,就會(huì )產(chǎn)生矛盾,到底以哪個(gè)線(xiàn)程為主。
為了避免這種情況的出現,JS就被設計成了單線(xiàn)程 。
JS引擎把所有任務(wù)分為兩類(lèi):宏任務(wù)、微任務(wù)。
宏任務(wù)有:
script
整體代碼微任務(wù)有:
文章一開(kāi)頭我們了解到了單線(xiàn)程的弊端,JS是通過(guò)事件循環(huán)機制(EventLoop)來(lái)解決這一弊端的,接下來(lái)我們來(lái)看下EventLoop的執行規則:
我們了解完它的執行規則后,接下來(lái)我們舉個(gè)例子來(lái)說(shuō)明下,如下所示:
console.log("1"); // 1 同步代碼:立即執行 [1]
setTimeout(function() {
console.log("2"); // 3 同步代碼執行執行 輸出2
process.nextTick(function() {
console.log("3"); // 4 進(jìn)入微任務(wù)隊列 [3]
});
new Promise(function(resolve) {
console.log("4"); // 3 同步代碼執行執行 輸出4
resolve();
}).then(function() {
console.log("5"); // 4 進(jìn)入微任務(wù)隊列 [3, 5]
});
});
process.nextTick(function() {
console.log("6"); // 2 進(jìn)入微任務(wù)隊列 [6]
});
new Promise(function(resolve) {
console.log("7"); // 1 宏任務(wù):立即執行 [1, 7]
resolve();
}).then(function() {
console.log("8"); // 2 進(jìn)入微任務(wù)隊列 [6, 8]
});
setTimeout(function() {
console.log("9"); // 5 宏任務(wù):立即執行 [9]
process.nextTick(function() {
console.log("10"); // 6 進(jìn)入微任務(wù)隊列 [10]
});
new Promise(function(resolve) {
console.log("11"); // 5 宏任務(wù):立即執行 [9, 11]
resolve();
}).then(function() {
console.log("12"); // 6 進(jìn)入微任務(wù)隊列 [10, 12]
});
});
// 執行順序:1 7 6 8 2 4 3 5 9 11 10 12
process.nextTick()為node中的方法,你可以把它理解為與promise一樣的微任務(wù),promise的executor函數中的同步代碼會(huì )立即執行。
我們來(lái)分析下上述代碼的執行順序,如下圖所示:
運行結果如下所示:
當你把上述示例代碼啃透后,那么你也就理解js的事件循環(huán)機制了。
當然,你可能沒(méi)有那么快就啃透這個(gè)例子,這種概念性的東西,掌握它最好的辦法就是:將示例代碼放到編輯器里,對照著(zhù)事件循環(huán)的執行規則,一行一行的去讀代碼,大腦過(guò)一遍,猜測運行結果,然后再去執行代碼判斷執行結果是否與你猜的一致。
最后,舉一反三,去網(wǎng)上找一些事件循環(huán)的面試題多加練習,慢慢的你就把這個(gè)知識點(diǎn)啃透了,Good Luck!
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自本網(wǎng)站內容采集于網(wǎng)絡(luò )互聯(lián)網(wǎng)轉載等其它媒體和分享為主,內容觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如侵犯了原作者的版權,請告知一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容,聯(lián)系我們QQ:712375056,同時(shí)歡迎投稿傳遞力量。
Copyright ? 2009-2022 56dr.com. All Rights Reserved. 特網(wǎng)科技 特網(wǎng)云 版權所有 特網(wǎng)科技 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 百度云 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2
建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站