位置: IT常识 - 正文

事件循环(Event Loop)

编辑:rootadmin
事件循环(Event Loop) 文章目录单线程事件循环机制(Event Loop)1、同步任务与异步任务同步任务异步任务宏任务微任务2、执行过程3、执行顺序4、举例:实例1实例2单线程

推荐整理分享事件循环(Event Loop),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:,内容如对您有帮助,希望把文章链接给更多的朋友!

JavaScript是一种单线程的编程语言,同一时间只能做一件事,所有任务都需要排队依次完成。 为什么JS不能有多个线程呢 答:作为浏览器脚本语言,JavaScript的主要用途是与用户互动,以及操作DOM。这决定了它只能是单线程,否则会带来很复杂的同步问题。比如,假定JavaScript同时有两个线程,一个线程在某个DOM节点上添加内容,另一个线程删除了这个节点,这时浏览器应该以哪个线程为准。

​ 为了避免这种复杂性,因此JS只能是单线程。

事件循环机制(Event Loop)

含义:事件循环分为两种,分别是浏览器事件循环和node.js事件循环,JavaScript是一门单线程语言,指主线程只有一个。Event Loop事件循环,其实就是JS引擎管理事件执行的一个流程,具体由运行环境确定。目前JS的主要运行环境有两个,浏览器和Node.js。

​ 事件循环机制告诉了我们JS代码的执行顺序,是指浏览器或Node的一种解决JS单线程运行时不会阻塞的一种机制。

浏览器的事件循环又分为同步任务和异步任务

1、同步任务与异步任务同步任务事件循环(Event Loop)

含义:在主线程上排队执行的任务,只有一个任务执行完毕,才能执行后一个任务

异步任务

含义:不进入主线程,而进入“任务队列(task queue)”的任务,只有“任务队列”通知主线程,某个异步任务可以执行了,该任务才会进入主线程执行。

分类:异步任务又分为宏任务和微任务。所有同步任务都在主线程上执行,形成一个函数调用栈(执行栈),而异步则先放到任务队列(task queue)里,任务队列又分为宏任务(macro-task)与微任务(micro-task)。

宏任务

宏任务包括:script(整体代码)、setTimout、setInterval、setImmediate(node.js环境)、I/O、UI交互事件

微任务

微任务包括:new promise().then(回调)、MutationObserver(html5新特新)、Object.observe(已废弃)、process.nextTick(node环境)

​ 若同时存在promise和nextTick,则先执行nextTick

2、执行过程所有同步任务都在主线程上执行,形成一个执行栈(调用栈);主线程之外,还存在一个‘任务队列’(task queue),浏览器中的各种 Web API 为异步的代码提供了一个单独的运行空间,当异步的代码运行完毕以后,会将代码中的回调送入到 任务队列中(队列遵循先进先出得原则)一旦主线程的栈中的所有同步任务执行完毕后,调用栈为空时系统就会将队列中的回调函数依次压入调用栈中执行,当调用栈为空时,仍然会不断循环检测任务队列中是否有代码需要执行;3、执行顺序先执行同步代码,遇到异步宏任务则将异步宏任务放入宏任务队列中,遇到异步微任务则将异步微任务放入微任务队列中,当所有同步代码执行完毕后,再将异步微任务从队列中调入主线程执行,微任务执行完毕后再将异步宏任务从队列中调入主线程执行,一直循环直至所有任务执行完毕。

注意:当宏任务和微任务都处于 任务队列(Task Queue) 中时,微任务的优先级大于宏任务,即先将微任务执行完,再执行宏任务;

4、举例:

setTimeout(() => { console.log("4"); setTimeout(() => { console.log("8"); }, 0); new Promise((r) => { console.log("5");//构造函数是同步的 r(); }).then(() => { console.log("7");//then()是异步的,这里已经入队 }); console.log("6"); }, 0); new Promise((r) => { console.log("1");//构造函数是同步的 r(); }).then(() => { console.log("3");//then()是异步的,这里已经入队 }); console.log("2");//输出顺序:1 2 3 4 5 6 7 8 实例1setTimeout(function(){ console.log('1');});new Promise(function(resolve){ console.log('2'); resolve();}).then(function(){ console.log('3');}); console.log('4'); //输出顺序:2 4 3 1

解释:

遇到setTimout,异步宏任务,放入宏任务队列中;遇到new Promise,Promise在实例化的过程中所执行的代码都是同步进行的,所以输出2;而Promise.then中注册的回调才是异步执行的,将其放入微任务队列中遇到同步任务console.log(‘4’);输出4;主线程中同步任务执行完从微任务队列中取出任务到主线程中,输出3,微任务队列为空从宏任务队列中取出任务到主线程中,输出1,宏任务队列为空,结束~实例2setTimeout(()=>{ new Promise(resolve =>{ resolve(); }).then(()=>{ console.log('test'); }); console.log(4);});new Promise(resolve => { resolve(); console.log(1)}).then( () => { console.log(3); Promise.resolve().then(() => { console.log('before timeout'); }).then(() => { Promise.resolve().then(() => { console.log('also before timeout') }) })})console.log(2); //输出:1 2 3 before timeout also before timeout 4 test

解释:

遇到setTimeout,异步宏任务,将() => {console.log(4)}放入宏任务队列中;遇到new Promise,Promise在实例化的过程中所执行的代码都是同步进行的,所以输出1;而Promise.then中注册的回调才是异步执行的,将其放入微任务队列中遇到同步任务console.log(2),输出2;主线程中同步任务执行完从微任务队列中取出任务到主线程中,输出3,此微任务中又有微任务,Promise.resolve().then(微任务a).then(微任务b),将其依次放入微任务队列中;从微任务队列中取出任务a到主线程中,输出 before timeout;从微任务队列中取出任务b到主线程中,任务b又注册了一个微任务c,放入微任务队列中;从微任务队列中取出任务c到主线程中,输出 also before timeout;微任务队列为空从宏任务队列中取出任务到主线程,此任务中注册了一个微任务d,将其放入微任务队列中,接下来遇到输出4,宏任务队列为空从微任务队列中取出任务d到主线程 ,输出test,微任务队列为空,结束
本文链接地址:https://www.jiuchutong.com/zhishi/287248.html 转载请保留说明!

上一篇:flex 布局中子元素设置宽度无效的解决办法(flex布局子元素height100)

下一篇:发财树怎么修剪枝叶——让你的发财树与从不同(发财树怎么修剪枝叶视频教程)

  • wps批注怎么加(wps批注怎么加图片)

    wps批注怎么加(wps批注怎么加图片)

  • 大数据分析的理论核心是什么算法(大数据分析的理论核心就是什么)

    大数据分析的理论核心是什么算法(大数据分析的理论核心就是什么)

  • 华为手机相互充电怎么使用(华为手机相互充电方法无线充电)

    华为手机相互充电怎么使用(华为手机相互充电方法无线充电)

  • i9 9900k配什么显卡(i9-9900k配什么主板)

    i9 9900k配什么显卡(i9-9900k配什么主板)

  • 为什么拷贝不到库乐队(拷贝不上是咋回事?)

    为什么拷贝不到库乐队(拷贝不上是咋回事?)

  • 腾讯会议解除静音什么意思(腾讯会议解除静音是开着还是关着)

    腾讯会议解除静音什么意思(腾讯会议解除静音是开着还是关着)

  • oppo手机qq怎么设置自动回复消息(OPPO手机qq怎么设置密码锁屏)

    oppo手机qq怎么设置自动回复消息(OPPO手机qq怎么设置密码锁屏)

  • 苹果零售机是什么意思(苹果零售机是什么字母开头)

    苹果零售机是什么意思(苹果零售机是什么字母开头)

  • 华为5g芯片叫什么名字(华为5g芯片叫什么)

    华为5g芯片叫什么名字(华为5g芯片叫什么)

  • vivoz5线下有售吗(vivoz5实体店买得到吗)

    vivoz5线下有售吗(vivoz5实体店买得到吗)

  • 手机自动回复短信怎么取消(手机自动回复短信怎么弄)

    手机自动回复短信怎么取消(手机自动回复短信怎么弄)

  • 运算器可进行哪些运算(运算器可实现什么运算)

    运算器可进行哪些运算(运算器可实现什么运算)

  • nova5pro充电器多大(nova5 pro充电器参数)

    nova5pro充电器多大(nova5 pro充电器参数)

  • 电脑爱奇艺怎么切换账号(电脑爱奇艺怎么下载视频)

    电脑爱奇艺怎么切换账号(电脑爱奇艺怎么下载视频)

  • 怎么下小红书(怎么下小红书原图)

    怎么下小红书(怎么下小红书原图)

  • 安卓手机倒问号怎么打(安卓手机倒问号手机怎么打出来)

    安卓手机倒问号怎么打(安卓手机倒问号手机怎么打出来)

  • 快手的私密什么意思(快手私密在哪里能找到)

    快手的私密什么意思(快手私密在哪里能找到)

  • 拼多多每月消费怎么查(拼多多每月消费券怎么领)

    拼多多每月消费怎么查(拼多多每月消费券怎么领)

  • 华为手机如何查激活时间(华为手机如何查找对方手机位置)

    华为手机如何查激活时间(华为手机如何查找对方手机位置)

  • 苹果mini5什么屏(苹果mini5屏幕是什么材质)

    苹果mini5什么屏(苹果mini5屏幕是什么材质)

  • 如何关闭微信指纹锁(如何关闭微信指纹支付解锁)

    如何关闭微信指纹锁(如何关闭微信指纹支付解锁)

  • erofs什么意思(eros flame什么意思)

    erofs什么意思(eros flame什么意思)

  • 怎么设置不接电话(怎么设置不接电话不收短信)

    怎么设置不接电话(怎么设置不接电话不收短信)

  • 抖音己重置是怎么回事(抖音已重置怎么解决)

    抖音己重置是怎么回事(抖音已重置怎么解决)

  • MAC OS X中更改变默认打开文件应用程序的方法(更改macbook)

    MAC OS X中更改变默认打开文件应用程序的方法(更改macbook)

  • Vue3父子组件间传参通信(vue父组件子组件)

    Vue3父子组件间传参通信(vue父组件子组件)

  • 企业的进项税额怎么算
  • 增值税附加税包括哪些税种及税率
  • 四种股利分配政策类型
  • 土地使用税退税账务处理
  • 长期投资换入固定资产如何处理
  • 工业企业生产费用按经济内容划分,一般称为
  • 预付货款核销如何做会计摘要呢?
  • 进货有商业折扣商品怎么入库
  • 建筑业预缴税款都要填哪些表
  • 代收水电气费加盟
  • 预收账款转为主营业务收入
  • 营业收入不开发票
  • 专票红冲如何做账
  • 普通征税差额征税减按征税
  • 工程未结算能主张工程款吗
  • 分支机构能否随总机构认定为一般纳税人
  • 到银行开公司账户需要多少手续费
  • 先开票还是先预约
  • 防暑降温用品进什么科目
  • 可加计扣除的研发费用包括()
  • 不动产广告位出租税率是多少
  • 超出经营范围开发票
  • php中this的用法
  • 子公司之间交易抵消
  • 检验费用会计分录
  • win10待机界面进不去系统怎么办
  • 电脑方案表格
  • PHP:Memcached::fetch()的用法_Memcached类
  • msmpeng.exe是什么进程
  • win10怎么投影到手机
  • 发票开出后只收到部分款怎么处理?
  • php read
  • 出差没有发票,会计如何入账
  • 金融资产减值损益怎么算
  • 增值税发票查询结果不一致是什么意思
  • 建造师与建筑师的区别详解
  • php实现链式操作实验报告
  • 自产自销的农产品可以抵税吗
  • 承税汇票个人能用吗
  • mysqlbinlog -vvv
  • mysql 5.7.20 win64 安装及配置方法
  • mssql使用教程
  • 劳务派遣差额征税政策
  • 印花税减征比例
  • 长期股权投资会计准则2021修订
  • 房产租赁增值税率是5%还是9%
  • 费用计入什么表
  • 出口货物退运已补税(未退税)证明
  • 企业的承兑汇票会计分录
  • 汇兑损益在哪个表
  • 吸收合并需要编制
  • 结转损益类科目余额
  • 个人独资企业费用扣除
  • 银行贷款直接给钱吗
  • 社会保险费计提分录
  • 专票遗失没有认证能用吗
  • 本年利润的计算顺序为
  • MySQL之Field‘***’doesn’t have a default value错误解决办法
  • 查看mysql执行sql日志内容
  • mysql读写分离实现原理
  • mysql 树状查询语句
  • win2003设置网络共享
  • squid ssh
  • win7的查看方式
  • regloadr.exe - regloadr是什么进程 有什么用
  • tkmc.exe
  • dghm.exe是什么程序
  • 怎样设置从硬盘启动给电脑做系统
  • Tutorial2 Hello dot!
  • css教程大全
  • 安卓的通用在哪里
  • javascript教程
  • koa与node.js开发实战
  • Android4.4 wpa_supplicant深入分析之wpa_supplicant初始化流程
  • jquery动态设置css
  • 对税务领导的批示怎么写
  • 税控设备可以在电子税务局上买吗
  • 莅临指导和莅临交流的区别
  • 廉租房取消之后有什么补贴
  • 税票开户银行怎么填写?
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设