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

簡(jiǎn)單聊聊JavaScript的事件循環(huán)機(jī)制

 更新時(shí)間:2022年03月18日 10:01:51   作者:程序猿布?xì)W  
前端開(kāi)發(fā)的童鞋應(yīng)該都知道,JavaScript是一門(mén)單線程的腳本語(yǔ)言,這就意味著JavaScript 代碼在執(zhí)行的時(shí)候,只有一個(gè)主線程來(lái)執(zhí)行所有的任務(wù),同一個(gè)時(shí)間只能做同一件事情,這篇文章主要給大家介紹了關(guān)于JavaScript事件循環(huán)機(jī)制的相關(guān)資料,需要的朋友可以參考下

前言

JavaScript是一門(mén)單線程的弱類型語(yǔ)言,但是我們?cè)陂_(kāi)發(fā)中,經(jīng)常會(huì)遇到一些需要異步或者等待的處理操作。

類似ajax,亦或者ES6中新增的promise操作用于處理一些回調(diào)函數(shù)等。

概念

在JavaScript代碼執(zhí)行過(guò)程中,可以分為同步隊(duì)列和異步隊(duì)列。

同步任務(wù)類似我們常說(shuō)的立即執(zhí)行函數(shù),不需要等待可以直接進(jìn)行,可以直接進(jìn)入到主線程中去執(zhí)行,類似正常的函數(shù)調(diào)用等。

異步隊(duì)列則是異步執(zhí)行函數(shù),類似ajax請(qǐng)求,我們?cè)诎l(fā)起的過(guò)程中,會(huì)進(jìn)入到一個(gè)異步隊(duì)列,加載到任務(wù)當(dāng)中時(shí),需要進(jìn)行等待,之后才能進(jìn)行返回值的處理。

舉個(gè)栗子

下面一段代碼,我們可以先了解一些一些關(guān)于事件循環(huán)機(jī)制的一些基本的原理

console.log('1');
setTimeout(function() {
  console.log('4');
}, 0);
Promise.resolve().then(function() {
  console.log('2');
}).then(function() {
  console.log('3');
});
console.log('5');

我們將代碼打印到控制臺(tái)當(dāng)中,輸出結(jié)果是:1,5,2,3,4

我們知道,在JavaScript中,類似定時(shí)器,以及ES6新增的promise是異步函數(shù),回到我們上面所說(shuō)的隊(duì)列的概念當(dāng)中,不難得出,1和5為同步執(zhí)行隊(duì)列

在執(zhí)行完同步隊(duì)列中的代碼之后,再執(zhí)行異步隊(duì)列中的代碼。

TIP

在解析異步隊(duì)列的promise和定時(shí)器中,我們發(fā)現(xiàn),定時(shí)器setTimeout是后執(zhí)行于promise,這里我們引入JavaScript規(guī)范中的宏任務(wù)(Macro Task)和微任務(wù)(Micro Task)的概念

在JavaScript中,宏任務(wù)包含了:script( 整體代碼)、setTimeout、setInterval、I/O、UI 交互事件、setImmediate(Node.js 環(huán)境)

微任務(wù):Promise、MutaionObserver、process.nextTick(Node.js 環(huán)境)

再回到上面的定時(shí)器和promise的問(wèn)題,這時(shí)候我們知道,JavaScript中,當(dāng)有異步隊(duì)列的時(shí)候,優(yōu)先執(zhí)行微任務(wù),再執(zhí)行宏任務(wù)

再次舉個(gè)栗子

假如在異步隊(duì)列當(dāng)中存在異步隊(duì)列時(shí),我們需要怎么處理

console.log(1);
setTimeout(function() {
  console.log(5);
}, 10);
new Promise(resolve => {
    console.log(2);
    resolve();
    setTimeout(() => console.log(3), 10);
}).then(function() {
    console.log(4);
})
console.log(6);

將代碼執(zhí)行到控制臺(tái)中,得出的打印順序是:1,2,6,4,5,3

  • 不同于例子1當(dāng)中的promise,打印2是優(yōu)先于6執(zhí)行的,由此我們可以知道,new Promise在執(zhí)行過(guò)程中,在未執(zhí)行resolve或者rejected前,所執(zhí)行的代碼均為同步隊(duì)列中的代碼。
  • 再看4,5,3的執(zhí)行順序,在執(zhí)行微任務(wù)promise執(zhí)行回調(diào)resolve之后,對(duì)應(yīng)的then立即執(zhí)行
  • 在打印結(jié)果中,定時(shí)器5優(yōu)先執(zhí)行于—->屬于微任務(wù)promise中的宏任務(wù)定時(shí)器3,定時(shí)器5這個(gè)宏任務(wù)是在promise微任務(wù)這個(gè)隊(duì)列之后就加進(jìn)去,在promise執(zhí)行完成then回調(diào)之后,promise中的宏任務(wù)才加入到隊(duì)列當(dāng)中,因此在定時(shí)器5之后執(zhí)行

總結(jié)

在JavaScript中,宏任務(wù)包含了:script( 整體代碼)、setTimeout、setInterval、I/O、UI 交互事件、setImmediate(Node.js 環(huán)境)

微任務(wù):Promise、MutaionObserver、process.nextTick(Node.js 環(huán)境);

在執(zhí)行過(guò)程中,同步代碼優(yōu)先于其他任務(wù)隊(duì)列中的代碼,

定時(shí)器,promise這類任務(wù),在執(zhí)行過(guò)程中,會(huì)先加入隊(duì)列,

在執(zhí)行完同步代碼之后,再根據(jù)宏任務(wù)和微任務(wù)的分類,先執(zhí)行微任務(wù)隊(duì)列,再執(zhí)行宏任務(wù)隊(duì)列。

到此這篇關(guān)于JavaScript事件循環(huán)機(jī)制的文章就介紹到這了,更多相關(guān)JS事件循環(huán)機(jī)制內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • JavaScript制作簡(jiǎn)單計(jì)算器功能

    JavaScript制作簡(jiǎn)單計(jì)算器功能

    這篇文章主要為大家詳細(xì)介紹了JavaScript制作簡(jiǎn)單計(jì)算器功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • H5跳轉(zhuǎn)小程序按鈕不顯示(wx-open-launch-weapp)踩坑指南

    H5跳轉(zhuǎn)小程序按鈕不顯示(wx-open-launch-weapp)踩坑指南

    這篇文章主要給大家介紹了關(guān)于H5跳轉(zhuǎn)小程序按鈕不顯示(wx-open-launch-weapp)踩坑的相關(guān)資料,文中介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2023-02-02
  • 理解javascript中的嚴(yán)格模式

    理解javascript中的嚴(yán)格模式

    這篇文章主要幫助大家理解javascript中的嚴(yán)格模式,何為嚴(yán)格模式,如何啟用嚴(yán)格模式,感興趣的小伙伴們可以參考一下
    2016-02-02
  • JavaScript內(nèi)置日期、時(shí)間格式化時(shí)間實(shí)例代碼

    JavaScript內(nèi)置日期、時(shí)間格式化時(shí)間實(shí)例代碼

    JS中的 Date 對(duì)象用于處理日期和時(shí)間,Date對(duì)象和Math對(duì)象不一樣,Date是一個(gè)構(gòu)造函數(shù),需要實(shí)例化后才能使用對(duì)象中具體的方法和屬性。這篇文章主要給大家介紹了關(guān)于JavaScript內(nèi)置日期、時(shí)間格式化時(shí)間的相關(guān)資料,需要的朋友可以參考下
    2021-05-05
  • JS設(shè)計(jì)模式之命令模式概念與用法分析

    JS設(shè)計(jì)模式之命令模式概念與用法分析

    這篇文章主要介紹了JS設(shè)計(jì)模式之命令模式概念與用法,簡(jiǎn)單描述了命令模式的原理、功能并結(jié)合javascript實(shí)例形式分析了命令模式相關(guān)定義與使用技巧,需要的朋友可以參考下
    2018-02-02
  • js實(shí)現(xiàn)人才網(wǎng)站職位選擇功能的方法

    js實(shí)現(xiàn)人才網(wǎng)站職位選擇功能的方法

    這篇文章主要介紹了js實(shí)現(xiàn)人才網(wǎng)站職位選擇功能的方法,涉及javascript動(dòng)態(tài)操作頁(yè)面元素結(jié)點(diǎn)的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-08-08
  • JavaScript使用html2canvas實(shí)現(xiàn)截取HTML并生成圖片

    JavaScript使用html2canvas實(shí)現(xiàn)截取HTML并生成圖片

    在前端開(kāi)發(fā)中,有時(shí)我們需要將網(wǎng)頁(yè)的一部分或整個(gè)頁(yè)面截取并保存為圖片,這在生成報(bào)告、分享內(nèi)容或保存用戶界面狀態(tài)等場(chǎng)景中非常有用,本文將介紹如何使用 JavaScript 庫(kù) html2canvas 來(lái)實(shí)現(xiàn)這一功能,并提供一個(gè)完整的示例,需要的朋友可以參考下
    2024-10-10
  • javascript循環(huán)鏈表之約瑟夫環(huán)的實(shí)現(xiàn)方法

    javascript循環(huán)鏈表之約瑟夫環(huán)的實(shí)現(xiàn)方法

    這是一道比較經(jīng)典的循環(huán)鏈表問(wèn)題,在華為上機(jī)筆試中也出現(xiàn)過(guò)。 約瑟夫環(huán)是一個(gè)數(shù)學(xué)的應(yīng)用問(wèn)題,下面這篇文章主要就給大家介紹了javascript循環(huán)鏈表之約瑟夫環(huán)的實(shí)現(xiàn)方法,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-01-01
  • 微信小程序?qū)崿F(xiàn)action-sheet彈出底部菜單功能【附源碼下載】

    微信小程序?qū)崿F(xiàn)action-sheet彈出底部菜單功能【附源碼下載】

    這篇文章主要介紹了微信小程序?qū)崿F(xiàn)action-sheet彈出底部菜單功能,結(jié)合實(shí)例形式分析了action-sheet組件彈出菜單的使用技巧,包括元素遍歷、事件響應(yīng)及屬性設(shè)置等操作方法,并附帶源碼供讀者下載參考,需要的朋友可以參考下
    2017-12-12
  • 原生js實(shí)現(xiàn)下拉框功能(支持鍵盤(pán)事件)

    原生js實(shí)現(xiàn)下拉框功能(支持鍵盤(pán)事件)

    本文主要分享了原生js實(shí)現(xiàn)下拉框(支持鍵盤(pán)事件)功能的示例代碼。具有一定的參考價(jià)值,下面跟著小編一起來(lái)看下吧
    2017-01-01

最新評(píng)論

安新县| 高淳县| 桐柏县| 锡林郭勒盟| 电白县| 光山县| 泽普县| 吉木乃县| 南充市| 楚雄市| 阳高县| 江源县| 洛隆县| 嵩明县| 邢台市| 彰化市| 南开区| 广丰县| 江永县| 芮城县| 荔浦县| 辽宁省| 上犹县| 西青区| 贵南县| 泰来县| 毕节市| 葫芦岛市| 拉萨市| 安岳县| 井陉县| 鄂温| 涞源县| 汽车| 通州市| 怀宁县| 凤凰县| 普宁市| 青岛市| 乌兰察布市| 浪卡子县|