在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

JAVASCRIPT與單個線程的工作

汽車玩家 ? 來源:今日頭條 ? 作者:魏建民 ? 2020-05-05 22:07 ? 次閱讀

事件循環是用來理解JavaScript的最重要的方面之一。這篇文章旨在解釋JavaScript如何與單個線程一起工作的細節,以及它如何處理異步函數。

JavaScript代碼運行是單線程。一次只執行一件事。這實際上是一個非常有用的限制,因為它簡化了很多程序,從而不必擔心并發問題。

您只需要注意編寫代碼的方式,避免任何可能阻塞線程的內容,如同步調用或無限循環。

通常,在大多數瀏覽器中,每個瀏覽器都有一個事件循環,以使每個進程隔離,并避免web頁面具有無限循環或繁重的處理來阻塞整個瀏覽器。

你最需要擔心的是,您的代碼將在單個事件循環上運行,并在編寫代碼時考慮到這一點,以避免阻塞它。

阻止事件循環

任何花費太長時間將控制權返回給事件循環的JavaScript代碼都會阻止頁面中任何JavaScript代碼的執行,甚至阻止UI線程,用戶也無法點擊,滾動頁面等等。

幾乎所有JavaScript中的I / O操作都是非阻塞的。網絡請求,Node.js文件系統操作等。阻塞是個例外,這就是為什么JavaScript基于回調,以及最近的promises和async / await。

調用堆棧

調用堆棧是LIFO隊列(Last In,FirstOut)。事件循環不斷檢查調用堆棧以查看是否存在需要運行的任何函數。

在執行此操作時,它會將它找到的任何函數調用添加到調用堆棧并按順序執行每個調用。

一個簡單的事件循環說明:

JAVASCRIPT與單個線程的工作

當此代碼運行時,首先foo()調用。在foo()我們第一次調用bar(),然后我們調用baz()。

排隊功能執行

上面的例子運行特點:JavaScript找到要執行的東西,按順序運行它們。

讓我們看看如何推遲函數直到堆棧清除:

用例setTimeout(()=> {}), 0)是調用一個函數,但是一旦執行了代碼中的每個其他函數就執行它。

JAVASCRIPT與單個線程的工作

當此代碼運行時,首先調用foo()。在foo()里面我們首先調用setTimeout,bar作為參數傳遞,然后我們指示它盡可能快地運行,將0作為計時器傳遞。然后我們調用baz()。

消息隊列

調用setTimeout()時,瀏覽器或Node.js啟動計時器。當計時器到期,我們將0作為超時,回調函數立即被放入消息隊列中。

消息隊列也是用戶發起的事件(如單擊事件、鍵盤事件或獲取響應)在代碼有機會對其作出響應之前排隊的地方。或者像onLoad這樣的DOM事件。

循環優先處理調用堆棧,它首先處理在調用堆棧中找到的所有東西,一旦調用堆棧中沒有任何東西,它就會去獲取事件隊列中的東西。

我們不必等待像setTimeout,fetch或其他東西這樣的函數來完成自己的工作,因為它們是由瀏覽器提供的,并且它們運行在自己的線程中。

ES6作業隊列

ECMAScript 2015引入了Promises使用的作業隊列概念(也在ES6 / ES2015中引入)。這是一種盡快執行異步函數結果的方法,而不是放在調用堆棧的末尾。

在當前函數結束之前解析的Prom將在當前函數之后立即執行。

我覺得在游樂園里過山車的比喻很好:消息隊列將你放在隊列的后面,在所有其他人的后面,你將不得不等待輪到你,而作業隊列是快速通票這可以讓你在完成上一個之后再騎一次。

JAVASCRIPT與單個線程的工作

這是Promises(和Async / await,它建立在promises上)和普通的舊異步函數setTimeout()或其他平臺API 之間的巨大差異。

javascrit的事件循環是這門語言中非常重要且基礎的概念。清楚的了解了事件循環的執行順序和每一個階段的特點,可以使我們對一段異步代碼的執行順序有一個清晰的認識,從而減少代碼運行的不確定性。合理的使用各種延遲事件的方法,有助于代碼更好的按照其優先級去執行。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Web
    Web
    +關注

    關注

    2

    文章

    1265

    瀏覽量

    69531
  • javascript
    +關注

    關注

    0

    文章

    519

    瀏覽量

    53889
收藏 人收藏

    評論

    相關推薦

    javascript:void(0) 是否影響SEO優化

    使用 javascript:void(0) 確實可能對SEO優化產生負面影響 。以下是關于 javascript:void(0) 對SEO影響的具體分析: 搜索引擎爬蟲的理解問題 搜索引擎爬蟲(如
    的頭像 發表于 12-31 16:08 ?163次閱讀

    javascript:void(0) 的作用是什么

    javascript:void(0) 在 HTML 和 JavaScript 中是一個常見的表達式,主要用來創建一個無操作的鏈接(通常是 標簽)或者阻止默認事件處理。具體來說,它的作用有以下幾點
    的頭像 發表于 12-31 15:55 ?199次閱讀

    socket 多線程編程實現方法

    在現代網絡編程中,多線程技術被廣泛應用于提高服務器的并發處理能力。Socket編程是網絡通信的基礎,而將多線程技術應用于Socket編程,可以顯著提升服務器的性能。 多線程編程的基本概念 多
    的頭像 發表于 11-12 14:16 ?398次閱讀

    CPU線程和程序線程的區別

    CPU的線程與程序的線程在概念、作用、實現方式以及性能影響等方面存在顯著差異。以下是對兩者區別的詳細闡述,旨在深入探討這一技術話題。
    的頭像 發表于 09-02 11:18 ?1079次閱讀

    鴻蒙語言基礎類庫:ohos.convertxml xml轉換JavaScript

    轉換xml文本為JavaScript對象。
    的頭像 發表于 07-08 15:54 ?441次閱讀
    鴻蒙語言基礎類庫:ohos.convertxml  xml轉換<b class='flag-5'>JavaScript</b>

    探索虛擬線程:原理與實現

    虛擬線程的引入與優勢 在Loom項目之前,Java虛擬機(JVM)中的線程是通過java.lang.Thread類型來實現的,這些線程被稱為平臺線程。 然而,平臺
    的頭像 發表于 06-24 11:35 ?321次閱讀
    探索虛擬<b class='flag-5'>線程</b>:原理與實現

    鴻蒙開發:【線程模型】

    管理其他線程的ArkTS引擎實例,例如使用TaskPool(任務池)創建任務或取消任務、啟動和終止Worker線程
    的頭像 發表于 06-13 16:38 ?427次閱讀
    鴻蒙開發:【<b class='flag-5'>線程</b>模型】

    鴻蒙APP開發:【ArkTS類庫多線程】TaskPool和Worker的對比(2)

    創建Worker的線程稱為宿主線程(不一定是主線程工作線程也支持創建Worker子線程),Wo
    的頭像 發表于 03-27 15:44 ?547次閱讀
    鴻蒙APP開發:【ArkTS類庫多<b class='flag-5'>線程</b>】TaskPool和Worker的對比(2)

    java實現多線程的幾種方式

    Java實現多線程的幾種方式 多線程是指程序中包含了兩個或以上的線程,每個線程都可以并行執行不同的任務或操作。Java中的多線程可以提高程序
    的頭像 發表于 03-14 16:55 ?748次閱讀

    python中5種線程鎖盤點

    線程安全是多線程或多進程編程中的一個概念,在擁有共享數據的多條線程并行執行的程序中,線程安全的代碼會通過同步機制保證各個線程都可以正常且正確
    發表于 03-07 11:08 ?1622次閱讀
    python中5種<b class='flag-5'>線程</b>鎖盤點

    基于RTOS的應用進程中的典型線程

    RTOS中的關鍵因素是最小的中斷延遲和最小的線程切換延遲。RTOS的價值在于它的響應速度或可預測性,而不是它在給定時間段內可以執行的工作量。
    發表于 03-05 09:32 ?655次閱讀
    基于RTOS的應用進程中的典型<b class='flag-5'>線程</b>

    什么是動態線程池?動態線程池的簡單實現思路

    因此,動態可監控線程池一種針對以上痛點開發的線程池管理工具。主要可實現功能有:提供對 Spring 應用內線程池實例的全局管控、應用運行時動態變更線程池參數以及
    的頭像 發表于 02-28 10:42 ?658次閱讀

    linux多線程編程實例

    linux線程
    的頭像 發表于 02-15 21:16 ?487次閱讀
    linux多<b class='flag-5'>線程</b>編程實例

    線程是什么的基本單位 進程與線程的本質區別

    線程是操作系統中處理器調度的基本單位,它代表著獨立的執行流。在一個進程中,可以包含多個線程,這些線程共享相同的進程資源,如內存空間、文件描述符等。 進程是操作系統中運行的程序的實例,它包含了程序
    的頭像 發表于 02-02 16:30 ?965次閱讀

    .NET8性能優化之線程

    目前來說,沒有確切的證據證明哪個線程池好用,或者效率更高。但是開發者可以使用上面的選項來進行自己的選擇,有一個測試就是在Windows線程池在比較大的機器上的IO擴展性不太好。如果你的應用程序已經
    的頭像 發表于 01-22 14:50 ?1181次閱讀
    主站蜘蛛池模板: 女性一级全黄生活片在线播放| 亚洲网站视频| 久久黄色精品视频| 亚洲国产成人成上人色| 日韩手机看片| 综合色综合| 国产人成精品免费视频| 久久人精品| 欧美成人一区二区三区在线电影| 天堂网址| 五月激情婷婷综合| 亚洲精品色一区色二区色三区| 香蕉视频啪啪| 亚洲国产成人久久99精品| 特级片网站| 四虎永久在线精品视频免费观看| 色一欲一性一乱一区二区三区| 五月综合激情网| 日本高清色视频在线观看免费| 日本亚洲精品色婷婷在线影院| 四大名著成人高h肉版| 天天看视频| 免费能直接在线观看黄的视频| 免费观看黄色网页| 成人午夜性视频欧美成人| 成人综合色站| 日本特级黄录像片| 狠狠干天天爱| 成人精品第一区二区三区| 99香蕉国产| 酒色影院| 亚洲精品一卡2卡3卡三卡四卡| 亚洲成a人一区二区三区| 精品一区二区三区视频| 综合99| 亚洲合集综合久久性色| 欧美午夜性| 国产精品 视频一区 二区三区| a级网| 天天艹夜夜艹| 精品免费视在线视频观看|