91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

JS的執行機制是什么意思

發布時間:2021-07-10 16:11:25 來源:億速云 閱讀:154 作者:chen 欄目:編程語言

本篇內容主要講解“JS的執行機制是什么意思”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“JS的執行機制是什么意思”吧!

前言

JavaScript是一門單線程的非阻塞腳本語言,同一時刻只允許一個代碼段執行。在單線程的機制下,執行異步任務時,在等待結果返回的這個時間段,后面的代碼就無法執行了。

JS在執行代碼時,遇到異步任務之后還有同步任務的場景時,它并不會等待異步任務執行完,而是先執行同步任務,那么JS是如何做到這一點的呢?

本篇文章將詳細講解上述問題,歡迎各位感興趣的開發者閱讀本文。

事件循環

單線程

講事件循環之前,我們先來理解下為什么JS不設計成多線程的。

我們做個假設,如果JS是多線程的,因為JS有DOM API可以操作DOM,此時如果有兩個線程在操作同一個DOM,線程1刪除了這個dom節點,線程2要操作這個dom,就會產生矛盾,到底以哪個線程為主。

為了避免這種情況的出現,JS就被設計成了單線程 。 

宏任務與微任務

JS引擎把所有任務分為兩類:宏任務、微任務。

宏任務有:

  • script整體代碼
  • setTimeout、setInterval
  • I/O
  • UI渲染
  • postMessage
  • MessageChannel
  • requestAnimationFrame
  • setImmediate(Node.js 環境)

微任務有:

  • new Promise.then()
  • MutaionObserver
  • process.nextTick(Node.js 環境)

執行規則

文章一開頭我們了解到了單線程的弊端,JS是通過事件循環機制(EventLoop)來解決這一弊端的,接下來我們來看下EventLoop的執行規則:

  • 所有代碼作為宏任務進入主線程執行棧,開始執行
  • 執行過程中,同步代碼會立即執行,宏任務進入宏任務隊列,微任務進入微任務隊列
  • 當前宏任務執行完成出隊,讀取微任務隊列,有則執行,直至全部執行完畢
  • 執行瀏覽器ui進程渲染
  • 檢查是否有webworker任務,有則執行
  • 本輪宏任務執行完成,回到第2步,繼續執行,直至宏任務與微任務隊列全部清空

舉例說明

我們了解完它的執行規則后,接下來我們舉個例子來說明下,如下所示:


console.log("1"); // 1 同步代碼:立即執行 [1]

setTimeout(function() {
  console.log("2"); // 3 同步代碼執行執行 輸出2
  process.nextTick(function() {
    console.log("3"); // 4 進入微任務隊列 [3]
  });
  new Promise(function(resolve) {
    console.log("4"); // 3 同步代碼執行執行 輸出4
    resolve();
  }).then(function() {
    console.log("5"); // 4 進入微任務隊列 [3, 5]
  });
});

process.nextTick(function() {
  console.log("6"); // 2 進入微任務隊列 [6]
});

new Promise(function(resolve) {
  console.log("7"); // 1 宏任務:立即執行 [1, 7]
  resolve();
}).then(function() {
  console.log("8"); // 2 進入微任務隊列 [6, 8]
});

setTimeout(function() {
  console.log("9"); // 5 宏任務:立即執行 [9]
  process.nextTick(function() {
    console.log("10"); // 6 進入微任務隊列 [10]
  });
  new Promise(function(resolve) {
    console.log("11"); // 5 宏任務:立即執行 [9, 11]
    resolve();
  }).then(function() {
    console.log("12"); // 6 進入微任務隊列 [10, 12]
  });
});

// 執行順序:1 7 6 8 2 4 3 5 9 11 10 12
 

process.nextTick()為node中的方法,你可以把它理解為與promise一樣的微任務,promise的executor函數中的同步代碼會立即執行。

我們來分析下上述代碼的執行順序,如下圖所示:

JS的執行機制是什么意思

運行結果如下所示:

JS的執行機制是什么意思

當你把上述示例代碼啃透后,那么你也就理解js的事件循環機制了。

當然,你可能沒有那么快就啃透這個例子,這種概念性的東西,掌握它最好的辦法就是:將示例代碼放到編輯器里,對照著事件循環的執行規則,一行一行的去讀代碼,大腦過一遍,猜測運行結果,然后再去執行代碼判斷執行結果是否與你猜的一致。

最后,舉一反三,去網上找一些事件循環的面試題多加練習,慢慢的你就把這個知識點啃透了,Good Luck!

到此,相信大家對“JS的執行機制是什么意思”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

js
AI

徐闻县| 双牌县| 武威市| 常德市| 务川| 汉中市| 兴宁市| 三原县| 怀集县| 永和县| 安龙县| 宽甸| 芜湖市| 犍为县| 清镇市| 长阳| 平定县| 多伦县| 南平市| 瑞昌市| 邳州市| 乌审旗| 津南区| 合阳县| 湘阴县| 诸暨市| 教育| 黔西县| 临江市| 花莲县| 垫江县| 勃利县| 荣昌县| 平罗县| 沂水县| 江华| 昌邑市| 张北县| 建瓯市| 珠海市| 教育|