最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

javascript中的event loop事件循環(huán)詳解

 更新時(shí)間:2018年12月14日 08:36:05   作者:薛小白  
這篇文章主要給大家介紹了關(guān)于javascript中event loop事件循環(huán)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

前言

javascript是單線程的語(yǔ)言,也就是說(shuō),同一個(gè)時(shí)間只能做一件事。而這個(gè)單線程的特性,與它的用途有關(guān),作為瀏覽器腳本語(yǔ)言,JavaScript的主要用途是與用戶互動(dòng),以及操作DOM。這決定了它只能是單線程,否則會(huì)帶來(lái)很復(fù)雜的同步問(wèn)題。比如,假定JavaScript同時(shí)有兩個(gè)線程,一個(gè)線程在某個(gè)DOM節(jié)點(diǎn)上添加內(nèi)容,另一個(gè)線程刪除了這個(gè)節(jié)點(diǎn),這時(shí)瀏覽器應(yīng)該以哪個(gè)線程為準(zhǔn)?

為了利用多核CPU的計(jì)算能力,HTML5提出Web Worker標(biāo)準(zhǔn),允許JavaScript腳本創(chuàng)建多個(gè)線程,但是子線程完全受主線程控制,且不得操作DOM。所以,這個(gè)新標(biāo)準(zhǔn)并沒(méi)有改變JavaScript單線程的本質(zhì)

這是今天一個(gè)朋友發(fā)給我的一個(gè)面試題,

感覺(jué)還挺有意思的,

寫(xiě)個(gè)博客以供分享

先看看這個(gè)面試題目:

觀察下面的代碼,寫(xiě)出輸出結(jié)果

console.log('0')
setTimeout(function () {
 console.log('1');
});

new Promise(function(resolve,reject){
 console.log('2')
 resolve(3)
}).then(function(val){
 console.log(val)
})
console.log(4)

輸出結(jié)果: “0” “2” 4 3 “1”

今天主要是分析為什么輸出結(jié)果是這樣的?這就和 javascript 的執(zhí)行機(jī)制密切相關(guān)了.

Event Queue 和 Event Loop

javascript 是一門(mén)單線程的語(yǔ)言, 這就意味著在執(zhí)行代碼的時(shí)候, 都只有一個(gè)主線程來(lái)處理所有的任務(wù).

我們都知道 javascript 包括同步代碼和異步代碼, 那么 javascript 是怎么處理這兩種情況的呢?

  • 同步和異步任務(wù)分別進(jìn)入不同的執(zhí)行 場(chǎng)所, 同步的進(jìn)入主線程,異步的進(jìn)入 Event Table 并注冊(cè)函數(shù)
  • 當(dāng)指定的事情完成時(shí), Event Table 會(huì)將這個(gè)函數(shù)(回調(diào)函數(shù))移入 Event Queue
  • 主線程內(nèi)的任務(wù)執(zhí)行完畢為空, 會(huì)去 Event Queue 讀取對(duì)應(yīng)的函數(shù),進(jìn)入主線程執(zhí)行
  • 上述過(guò)程會(huì)不斷重復(fù), 也就是常說(shuō)的 Event Loop(事件循環(huán))

這里我們引進(jìn)了 Event Queue 事件隊(duì)列這一概念. 所有異步操作的回調(diào)都會(huì)進(jìn)入到這里. 然后等到主線程空閑, 就會(huì)從這里調(diào)取回調(diào)執(zhí)行.

setTimeout

setTimeout 相信大家都有使用過(guò), 可以延時(shí)執(zhí)行并且是異步執(zhí)行的.

但是有時(shí)候我們得到的結(jié)果往往是代碼實(shí)際執(zhí)行的時(shí)間比我們想要延時(shí)執(zhí)行的時(shí)間要久。這又是為什么呢?

這就和我們之前所說(shuō)的 Event Loop 有關(guān)了, 我們可以來(lái)具體看下 setTimeout 的執(zhí)行步驟:

setTimeout(function () {
asyncFn()
}, 1000);

syncFn()
  • asyncFn 將異步執(zhí)行函數(shù)放在 Event Table, 并且開(kāi)始計(jì)時(shí)
  • 開(kāi)始執(zhí)行 syncFn, 但是 syncFn 可能需要處理的內(nèi)容很多, 執(zhí)行時(shí)間超過(guò) 1 秒, 但是計(jì)時(shí)還在繼續(xù)
  • 計(jì)時(shí)到達(dá) 1 秒, setTimeout 延時(shí)完成, asyncFn 進(jìn)入 Event Queue 事件隊(duì)列, 但是主線程還在執(zhí)行, 所以只能等待
  • syncFn 執(zhí)行完成, 此時(shí) asyncFn 從事件隊(duì)列中進(jìn)入主線程執(zhí)行

所以有時(shí)候會(huì)出現(xiàn)代碼實(shí)際執(zhí)行時(shí)間比延時(shí)時(shí)間長(zhǎng)的情況。

宏任務(wù)和微任務(wù)

之前我們說(shuō)過(guò)異步任務(wù)會(huì)進(jìn)入到事件隊(duì)列中, 不同類型的任務(wù)會(huì)進(jìn)入到不同的隊(duì)列中, 比如宏任務(wù)會(huì)進(jìn)入到宏任務(wù)隊(duì)列中, 微任務(wù)會(huì)進(jìn)入到微任務(wù)隊(duì)列中.

我們只要記住 當(dāng)當(dāng)前執(zhí)行棧執(zhí)行完畢時(shí)會(huì)立刻先處理所有微任務(wù)隊(duì)列中的事件,然后再去宏任務(wù)隊(duì)列中取出一個(gè)事件。同一次事件循環(huán)中,微任務(wù)永遠(yuǎn)在宏任務(wù)之前執(zhí)行

這時(shí)候我們就可以解釋一開(kāi)始的代碼執(zhí)行結(jié)果了:

  • 主線程執(zhí)行按順序代碼
  • 遇到 setTimeout, 回調(diào)進(jìn)入到宏任務(wù)隊(duì)列上
  • 遇到 Promise, 立即執(zhí)行, then 函數(shù)進(jìn)入到微任務(wù)隊(duì)列
  • 同步代碼執(zhí)行結(jié)束, 主線程檢查是否存在微任務(wù), 發(fā)現(xiàn) then, 執(zhí)行
  • 微任務(wù)執(zhí)行完畢, 再去查找宏任務(wù) setTimeout, 執(zhí)行
  • setTimeout 執(zhí)行結(jié)束, 檢查是否存在微任務(wù), 不存在, 結(jié)束.

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • JAVA面試題 static關(guān)鍵字詳解

    JAVA面試題 static關(guān)鍵字詳解

    這篇文章主要介紹了JAVA面試題 淺析Java中的static關(guān)鍵字,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-07-07
  • 仿淘寶首頁(yè)分類列表效果實(shí)現(xiàn)代碼

    仿淘寶首頁(yè)分類列表效果實(shí)現(xiàn)代碼

    模板淘寶首頁(yè)的分類列表效果,17173的游戲分類效果也不錯(cuò)。
    2009-04-04
  • JS實(shí)現(xiàn)選項(xiàng)卡實(shí)例詳解

    JS實(shí)現(xiàn)選項(xiàng)卡實(shí)例詳解

    這篇文章主要介紹了JS實(shí)現(xiàn)選項(xiàng)卡的方法,結(jié)合實(shí)例形式詳細(xì)講述了JavaScript實(shí)現(xiàn)選項(xiàng)卡的布局與功能實(shí)現(xiàn)的完整步驟及相關(guān)技巧,需要的朋友可以參考下
    2015-11-11
  • js位運(yùn)算在實(shí)際中使用的實(shí)例教程

    js位運(yùn)算在實(shí)際中使用的實(shí)例教程

    我們可能很少在編程中用位運(yùn)算,如果沒(méi)深入學(xué)習(xí),可能也很難理解,下面這篇文章主要給大家介紹了關(guān)于js位運(yùn)算在實(shí)際中使用的相關(guān)資料,需要的朋友可以參考下
    2022-03-03
  • elementUI 設(shè)置input的只讀或禁用的方法

    elementUI 設(shè)置input的只讀或禁用的方法

    這篇文章主要介紹了elementUI 設(shè)置input的只讀或禁用的方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-10-10
  • 一個(gè)奇葩的最短的 IE 版本判斷JS腳本

    一個(gè)奇葩的最短的 IE 版本判斷JS腳本

    這篇文章主要介紹了一個(gè)奇葩的最短的 IE 版本判斷JS腳本,非??岬囊欢未a,需要的朋友可以參考下
    2014-05-05
  • 微信小程序分包操作實(shí)戰(zhàn)指南

    微信小程序分包操作實(shí)戰(zhàn)指南

    分包指的是把一個(gè)完整的小程序項(xiàng)目,按照需求劃分為不同的子包, 在構(gòu)建時(shí)打包成不同的分包,用戶在使用時(shí)按需進(jìn)行加載,下面這篇文章主要給大家介紹了關(guān)于微信小程序分包操作的相關(guān)資料,需要的朋友可以參考下
    2022-10-10
  • JavaScript中的this關(guān)鍵字使用方法總結(jié)

    JavaScript中的this關(guān)鍵字使用方法總結(jié)

    這篇文章主要介紹了JavaScript中的this關(guān)鍵字使用方法總結(jié),本文講解了作為對(duì)象方法調(diào)用、作為函數(shù)調(diào)用、作為構(gòu)造函數(shù)調(diào)用、使用 apply 或 call 調(diào)用等內(nèi)容,需要的朋友可以參考下
    2015-03-03
  • JS異步文件分片斷點(diǎn)上傳的實(shí)現(xiàn)思路

    JS異步文件分片斷點(diǎn)上傳的實(shí)現(xiàn)思路

    在項(xiàng)目中有時(shí)會(huì)遇到大文件上傳,經(jīng)常會(huì)出現(xiàn)鏈接超時(shí)的問(wèn)題,所以就需要使用文件分片上傳的方式來(lái)上傳大文件。下面通過(guò)本文給大家介紹js異步文件分片斷點(diǎn)上傳的實(shí)例代碼,需要的的朋友參考下吧
    2016-12-12
  • Bootstrap每天必學(xué)之導(dǎo)航條(二)

    Bootstrap每天必學(xué)之導(dǎo)航條(二)

    Bootstrap每天必學(xué)之導(dǎo)航條,進(jìn)一步向大家講解了導(dǎo)航條養(yǎng)殖,以及導(dǎo)航條中元素的使用方法,感興趣的小伙伴們可以參考一下
    2016-03-03

最新評(píng)論

太谷县| 日照市| 静宁县| 磐安县| 吕梁市| 阳新县| 塔河县| 晋宁县| 乌拉特前旗| 滕州市| 佛山市| 饶平县| 丽水市| 连云港市| 安岳县| 平原县| 南开区| 陇西县| 莆田市| 玛多县| 铜陵市| 永清县| 定南县| 思南县| 孝义市| 兴和县| 呈贡县| 汉川市| 茶陵县| 石狮市| 鞍山市| 昭通市| 呼和浩特市| 东乡| 安龙县| 无极县| 绥滨县| 简阳市| 白城市| 黑龙江省| 砚山县|