色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

JAVASCRIPT與單個(gè)線程的工作

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

事件循環(huán)是用來理解JavaScript的最重要的方面之一。這篇文章旨在解釋JavaScript如何與單個(gè)線程一起工作的細(xì)節(jié),以及它如何處理異步函數(shù)。

JavaScript代碼運(yùn)行是單線程。一次只執(zhí)行一件事。這實(shí)際上是一個(gè)非常有用的限制,因?yàn)樗?jiǎn)化了很多程序,從而不必?fù)?dān)心并發(fā)問題。

您只需要注意編寫代碼的方式,避免任何可能阻塞線程的內(nèi)容,如同步調(diào)用或無(wú)限循環(huán)。

通常,在大多數(shù)瀏覽器中,每個(gè)瀏覽器都有一個(gè)事件循環(huán),以使每個(gè)進(jìn)程隔離,并避免web頁(yè)面具有無(wú)限循環(huán)或繁重的處理來阻塞整個(gè)瀏覽器。

你最需要擔(dān)心的是,您的代碼將在單個(gè)事件循環(huán)上運(yùn)行,并在編寫代碼時(shí)考慮到這一點(diǎn),以避免阻塞它。

阻止事件循環(huán)

任何花費(fèi)太長(zhǎng)時(shí)間將控制權(quán)返回給事件循環(huán)的JavaScript代碼都會(huì)阻止頁(yè)面中任何JavaScript代碼的執(zhí)行,甚至阻止UI線程,用戶也無(wú)法點(diǎn)擊,滾動(dòng)頁(yè)面等等。

幾乎所有JavaScript中的I / O操作都是非阻塞的。網(wǎng)絡(luò)請(qǐng)求,Node.js文件系統(tǒng)操作等。阻塞是個(gè)例外,這就是為什么JavaScript基于回調(diào),以及最近的promises和async / await。

調(diào)用堆棧

調(diào)用堆棧是LIFO隊(duì)列(Last In,F(xiàn)irstOut)。事件循環(huán)不斷檢查調(diào)用堆棧以查看是否存在需要運(yùn)行的任何函數(shù)。

在執(zhí)行此操作時(shí),它會(huì)將它找到的任何函數(shù)調(diào)用添加到調(diào)用堆棧并按順序執(zhí)行每個(gè)調(diào)用。

一個(gè)簡(jiǎn)單的事件循環(huán)說明:

JAVASCRIPT與單個(gè)線程的工作

當(dāng)此代碼運(yùn)行時(shí),首先f(wàn)oo()調(diào)用。在foo()我們第一次調(diào)用bar(),然后我們調(diào)用baz()。

排隊(duì)功能執(zhí)行

上面的例子運(yùn)行特點(diǎn):JavaScript找到要執(zhí)行的東西,按順序運(yùn)行它們。

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

用例setTimeout(()=> {}), 0)是調(diào)用一個(gè)函數(shù),但是一旦執(zhí)行了代碼中的每個(gè)其他函數(shù)就執(zhí)行它。

JAVASCRIPT與單個(gè)線程的工作

當(dāng)此代碼運(yùn)行時(shí),首先調(diào)用foo()。在foo()里面我們首先調(diào)用setTimeout,bar作為參數(shù)傳遞,然后我們指示它盡可能快地運(yùn)行,將0作為計(jì)時(shí)器傳遞。然后我們調(diào)用baz()。

消息隊(duì)列

調(diào)用setTimeout()時(shí),瀏覽器或Node.js啟動(dòng)計(jì)時(shí)器。當(dāng)計(jì)時(shí)器到期,我們將0作為超時(shí),回調(diào)函數(shù)立即被放入消息隊(duì)列中。

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

循環(huán)優(yōu)先處理調(diào)用堆棧,它首先處理在調(diào)用堆棧中找到的所有東西,一旦調(diào)用堆棧中沒有任何東西,它就會(huì)去獲取事件隊(duì)列中的東西。

我們不必等待像setTimeout,fetch或其他東西這樣的函數(shù)來完成自己的工作,因?yàn)樗鼈兪怯蔀g覽器提供的,并且它們運(yùn)行在自己的線程中。

ES6作業(yè)隊(duì)列

ECMAScript 2015引入了Promises使用的作業(yè)隊(duì)列概念(也在ES6 / ES2015中引入)。這是一種盡快執(zhí)行異步函數(shù)結(jié)果的方法,而不是放在調(diào)用堆棧的末尾。

在當(dāng)前函數(shù)結(jié)束之前解析的Prom將在當(dāng)前函數(shù)之后立即執(zhí)行。

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

JAVASCRIPT與單個(gè)線程的工作

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

javascrit的事件循環(huán)是這門語(yǔ)言中非常重要且基礎(chǔ)的概念。清楚的了解了事件循環(huán)的執(zhí)行順序和每一個(gè)階段的特點(diǎn),可以使我們對(duì)一段異步代碼的執(zhí)行順序有一個(gè)清晰的認(rèn)識(shí),從而減少代碼運(yùn)行的不確定性。合理的使用各種延遲事件的方法,有助于代碼更好的按照其優(yōu)先級(jí)去執(zhí)行。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Web
    Web
    +關(guān)注

    關(guān)注

    2

    文章

    1269

    瀏覽量

    69623
  • javascript
    +關(guān)注

    關(guān)注

    0

    文章

    525

    瀏覽量

    53909
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    JavaScript與Rust和WebAssembly集成

    偶然一次機(jī)會(huì),接觸了Rust的代碼。當(dāng)時(shí)想給團(tuán)隊(duì)小伙伴做演示,發(fā)現(xiàn)自己并不能在移動(dòng)端按照文檔生成演示demo。我就想,要是Rust代碼能轉(zhuǎn)化成JavaScript就好了。結(jié)果一搜,還真有。
    的頭像 發(fā)表于 01-24 15:43 ?25次閱讀
    <b class='flag-5'>JavaScript</b>與Rust和WebAssembly集成

    SciChart—高性能的JavaScript圖表和圖形庫(kù)

    使用 SciChart 的 JavaScript 圖表庫(kù)為您的 JS 應(yīng)用程序發(fā)現(xiàn)終極解決方案。 使用 WebGL 創(chuàng)建動(dòng)態(tài)、高速的圖表和圖形,非常適合實(shí)時(shí)處理復(fù)雜的數(shù)據(jù)可視化。使用我們強(qiáng)大而靈活
    的頭像 發(fā)表于 01-22 10:15 ?53次閱讀
    SciChart—高性能的<b class='flag-5'>JavaScript</b>圖表和圖形庫(kù)

    Spire.XLS for JavaScript——多功能JavaScript電子表格庫(kù)(一)

    Spire.XLS for JavaScript 是一款專為開發(fā)人員設(shè)計(jì)的 JavaScript Excel 工具庫(kù),支持在任何 JavaScript 環(huán)境下直接創(chuàng)建、讀取、編輯和轉(zhuǎn)換 Excel
    的頭像 發(fā)表于 01-21 09:29 ?71次閱讀
    Spire.XLS for <b class='flag-5'>JavaScript</b>——多功能<b class='flag-5'>JavaScript</b>電子表格庫(kù)(一)

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

    使用 javascript:void(0) 確實(shí)可能對(duì)SEO優(yōu)化產(chǎn)生負(fù)面影響 。以下是關(guān)于 javascript:void(0) 對(duì)SEO影響的具體分析: 搜索引擎爬蟲的理解問題 搜索引擎爬蟲(如
    的頭像 發(fā)表于 12-31 16:08 ?182次閱讀

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

    javascript:void(0) 在 HTML 和 JavaScript 中是一個(gè)常見的表達(dá)式,主要用來創(chuàng)建一個(gè)無(wú)操作的鏈接(通常是 標(biāo)簽)或者阻止默認(rèn)事件處理。具體來說,它的作用有以下幾點(diǎn)
    的頭像 發(fā)表于 12-31 15:55 ?259次閱讀

    socket 多線程編程實(shí)現(xiàn)方法

    在現(xiàn)代網(wǎng)絡(luò)編程中,多線程技術(shù)被廣泛應(yīng)用于提高服務(wù)器的并發(fā)處理能力。Socket編程是網(wǎng)絡(luò)通信的基礎(chǔ),而將多線程技術(shù)應(yīng)用于Socket編程,可以顯著提升服務(wù)器的性能。 多線程編程的基本概念 多
    的頭像 發(fā)表于 11-12 14:16 ?439次閱讀

    CPU線程和程序線程的區(qū)別

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

    鴻蒙語(yǔ)言基礎(chǔ)類庫(kù):ohos.convertxml xml轉(zhuǎn)換JavaScript

    轉(zhuǎn)換xml文本為JavaScript對(duì)象。
    的頭像 發(fā)表于 07-08 15:54 ?479次閱讀
    鴻蒙語(yǔ)言基礎(chǔ)類庫(kù):ohos.convertxml  xml轉(zhuǎn)換<b class='flag-5'>JavaScript</b>

    探索虛擬線程:原理與實(shí)現(xiàn)

    虛擬線程的引入與優(yōu)勢(shì) 在Loom項(xiàng)目之前,Java虛擬機(jī)(JVM)中的線程是通過java.lang.Thread類型來實(shí)現(xiàn)的,這些線程被稱為平臺(tái)線程。 然而,平臺(tái)
    的頭像 發(fā)表于 06-24 11:35 ?342次閱讀
    探索虛擬<b class='flag-5'>線程</b>:原理與實(shí)現(xiàn)

    鴻蒙開發(fā):【線程模型】

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

    鴻蒙APP開發(fā):【ArkTS類庫(kù)多線程】TaskPool和Worker的對(duì)比(2)

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

    java實(shí)現(xiàn)多線程的幾種方式

    Java實(shí)現(xiàn)多線程的幾種方式 多線程是指程序中包含了兩個(gè)或以上的線程,每個(gè)線程都可以并行執(zhí)行不同的任務(wù)或操作。Java中的多線程可以提高程序
    的頭像 發(fā)表于 03-14 16:55 ?771次閱讀

    python中5種線程鎖盤點(diǎn)

    線程安全是多線程或多進(jìn)程編程中的一個(gè)概念,在擁有共享數(shù)據(jù)的多條線程并行執(zhí)行的程序中,線程安全的代碼會(huì)通過同步機(jī)制保證各個(gè)線程都可以正常且正確
    發(fā)表于 03-07 11:08 ?1650次閱讀
    python中5種<b class='flag-5'>線程</b>鎖盤點(diǎn)

    基于RTOS的應(yīng)用進(jìn)程中的典型線程

    RTOS中的關(guān)鍵因素是最小的中斷延遲和最小的線程切換延遲。RTOS的價(jià)值在于它的響應(yīng)速度或可預(yù)測(cè)性,而不是它在給定時(shí)間段內(nèi)可以執(zhí)行的工作量。
    發(fā)表于 03-05 09:32 ?688次閱讀
    基于RTOS的應(yīng)用進(jìn)程中的典型<b class='flag-5'>線程</b>

    什么是動(dòng)態(tài)線程池?動(dòng)態(tài)線程池的簡(jiǎn)單實(shí)現(xiàn)思路

    因此,動(dòng)態(tài)可監(jiān)控線程池一種針對(duì)以上痛點(diǎn)開發(fā)的線程池管理工具。主要可實(shí)現(xiàn)功能有:提供對(duì) Spring 應(yīng)用內(nèi)線程池實(shí)例的全局管控、應(yīng)用運(yùn)行時(shí)動(dòng)態(tài)變更線程池參數(shù)以及
    的頭像 發(fā)表于 02-28 10:42 ?691次閱讀
    主站蜘蛛池模板: 超碰视频在线 | 午夜家庭影院 | 亚洲成av人影院 | 中文无码第3页不卡av | 99热这里只就有精品22 | 亚洲精品福利一区二区在线观看 | 精品日韩二区三区精品视频 | 青草在线观看视频 | 欧美xxxxx九色视频免费观看 | 99久久婷婷国产麻豆精品电影 | xxxx18动漫| 麻豆成人久久精品二区三区网站 | 王雨纯羞羞 | 一二三四免费中文在线1 | 国产午夜精品理论片影院 | 亚洲欧美综合在线中文 | 国产又粗又猛又爽又黄的免费视频 | 黄色小说在线 | wwww69| 媚药调教被撑到合不拢h | 超碰在线公开视频 | 青青涩射射| 2022精品福利在线小视频 | 蜜芽丅v新网站在线观看 | 窝窝午夜色视频国产精品东北 | 亚洲AV永久无码精品澳门 | 国产精品第100页 | 色AV色婷婷96人妻久久久 | 美女直播喷水 | 成人精品视频网站 | 软糯白嫩双性受h | 久久精品视频在线直播6 | 午夜DV内射一区二区 | 国内精品久久久久久西瓜色吧 | 秋霞网在线伦理免费 | 国产亚洲999精品AA片在线爽 | 国产亚洲欧美日韩综合综合二区 | 99精品免费观看 | 国产女人毛片 | 亚洲久热无码中文字幕 | 日本久久久久久久做爰片日本 |