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

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

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

前言

JavaScript是一門單線程的弱類型語言,但是我們在開發(fā)中,經(jīng)常會遇到一些需要異步或者等待的處理操作。

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

概念

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

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

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

舉個栗子

下面一段代碼,我們可以先了解一些一些關(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');

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

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

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

TIP

在解析異步隊(duì)列的promise和定時器中,我們發(fā)現(xiàn),定時器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)境)

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

再次舉個栗子

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

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í)行到控制臺中,得出的打印順序是:1,2,6,4,5,3

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

定時器,promise這類任務(wù),在執(zhí)行過程中,會先加入隊(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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

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

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

    這篇文章主要為大家詳細(xì)介紹了JavaScript制作簡單計(jì)算器功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    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ì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2023-02-02
  • 理解javascript中的嚴(yán)格模式

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

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

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

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

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

    這篇文章主要介紹了JS設(shè)計(jì)模式之命令模式概念與用法,簡單描述了命令模式的原理、功能并結(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動態(tài)操作頁面元素結(jié)點(diǎn)的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-08-08
  • JavaScript使用html2canvas實(shí)現(xiàn)截取HTML并生成圖片

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

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

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

    這是一道比較經(jīng)典的循環(huán)鏈表問題,在華為上機(jī)筆試中也出現(xiàn)過。 約瑟夫環(huán)是一個數(shù)學(xué)的應(yīng)用問題,下面這篇文章主要就給大家介紹了javascript循環(huán)鏈表之約瑟夫環(huán)的實(shí)現(xiàn)方法,需要的朋友可以參考借鑒,下面來一起看看吧。
    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)下拉框功能(支持鍵盤事件)

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

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

最新評論

苗栗县| 长治县| 库车县| 富顺县| 南充市| 宣威市| 灵璧县| 中超| 亳州市| 日土县| 西林县| 无极县| 栾川县| 扶沟县| 临漳县| 安宁市| 鹤山市| 靖西县| 金平| 洞头县| 巴楚县| 天峻县| 吴江市| 巴林右旗| 彰武县| 如东县| 巍山| 民丰县| 台山市| 道孚县| 华容县| 仲巴县| 盐池县| 斗六市| 额济纳旗| 呼和浩特市| 宁明县| 宿迁市| 斗六市| 呈贡县| 彰化县|