位置: 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)

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

  • 天猫精灵能当电脑音箱使用吗(天猫精灵能当电脑蓝牙音响用吗)

    天猫精灵能当电脑音箱使用吗(天猫精灵能当电脑蓝牙音响用吗)

  • 小红书怎么发纯文字笔记(小红书怎么发纯图片)

    小红书怎么发纯文字笔记(小红书怎么发纯图片)

  • 亚马逊开店如何操作(亚马逊开店如何注销)

    亚马逊开店如何操作(亚马逊开店如何注销)

  • oppo reno ace有北斗导航功能吗(oppo oppo reno ace)

    oppo reno ace有北斗导航功能吗(oppo oppo reno ace)

  • 路由器信号差的原因(路由器信号差的原因及解决办法)

    路由器信号差的原因(路由器信号差的原因及解决办法)

  • 滴滴怎么付款给司机(滴滴怎么付款给车主)

    滴滴怎么付款给司机(滴滴怎么付款给车主)

  • 小米10后盖是玻璃的吗(小米10后盖玻璃多少钱)

    小米10后盖是玻璃的吗(小米10后盖玻璃多少钱)

  • 怎么转发抖音里面的视频(怎么转发抖音里别人的视频)

    怎么转发抖音里面的视频(怎么转发抖音里别人的视频)

  • qq账号管理删除后又自动出现(qq账号管理删除了账号后还能登录吗)

    qq账号管理删除后又自动出现(qq账号管理删除了账号后还能登录吗)

  • 华为畅玩9a什么时候上市的(华为畅玩9a什么处理器)

    华为畅玩9a什么时候上市的(华为畅玩9a什么处理器)

  • solidworks是一个什么软件(solidworks是一个零件一个零件的画然后再进行装配吗?)

    solidworks是一个什么软件(solidworks是一个零件一个零件的画然后再进行装配吗?)

  • 三星s9自动关机重启是什么原因(三星s9自动关机后无法开机)

    三星s9自动关机重启是什么原因(三星s9自动关机后无法开机)

  • 手机号副卡可以注册微信吗(手机号副卡可以办银行卡吗)

    手机号副卡可以注册微信吗(手机号副卡可以办银行卡吗)

  • 微信网络通信出现问题是什么意思(微信网络通信出现问题)

    微信网络通信出现问题是什么意思(微信网络通信出现问题)

  • 电信卡无法访问移动网络怎么解决(电信卡无法访问网络怎么样办)

    电信卡无法访问移动网络怎么解决(电信卡无法访问网络怎么样办)

  • 闲鱼账号一个手机可以注册几个(闲鱼一个手机号只能注册一个吗)

    闲鱼账号一个手机可以注册几个(闲鱼一个手机号只能注册一个吗)

  • 苹果手机怎么放大图片中的一部分(苹果手机怎么放小屏)

    苹果手机怎么放大图片中的一部分(苹果手机怎么放小屏)

  • itime是什么意思

    itime是什么意思

  • 举报qq群会不会被知道(举报qq群会被发现吗)

    举报qq群会不会被知道(举报qq群会被发现吗)

  • iphone怎么取消恢复模式吗(如何取消苹果数据恢复)

    iphone怎么取消恢复模式吗(如何取消苹果数据恢复)

  • 华为m6支持内存卡吗(华为m6支持扩展内存是多大的)

    华为m6支持内存卡吗(华为m6支持扩展内存是多大的)

  • 手机会冻关机吗(手机会冻裂吗)

    手机会冻关机吗(手机会冻裂吗)

  • 电脑运行内存怎么清理(电脑运行内存怎么扩大)

    电脑运行内存怎么清理(电脑运行内存怎么扩大)

  • arcade怎么订阅(arcade怎么订阅台湾)

    arcade怎么订阅(arcade怎么订阅台湾)

  • 不开钉钉手机会被定位吗(钉钉不插手机卡可以用吗?)

    不开钉钉手机会被定位吗(钉钉不插手机卡可以用吗?)

  • 苹果xr怎么录视频(苹果xr录视频怎么开闪光灯)

    苹果xr怎么录视频(苹果xr录视频怎么开闪光灯)

  • 捐赠税前扣除比例表
  • 纳税等级是指什么意思
  • 租赁服务增值税税率
  • 微信企业版支付
  • 行政单位利息收入可以扣除手续费
  • 收据四联分别叫什么
  • 停工留薪期工资计算公式
  • 公司购买的二手车如何计提折旧
  • 公司按揭购车可以抵扣税吗
  • 销售旧货时的售后是什么
  • 工会经费有关的增值税能否抵扣?
  • 工程发票备注怎么写
  • 征缴工会筹备金的规定
  • 公司收到保险公司的理赔款怎么做分录
  • 收到发票,未付款,付款的时候需要把发票复印做附件吗
  • 什么情况下要交增值税
  • 受托加工金银首饰是否代征消费税
  • 设备租赁收入属于什么收入
  • 转口贸易需要申报什么税
  • bois如何设置启动项
  • 一个网页账号在多个电脑登录
  • 业务员报销清单表
  • macos怎么看
  • 根据新企业会计准则,职工薪酬包括
  • antd 级联多选
  • nullable object must have a value
  • 如何利用路由器登陆花生壳
  • yii2入门
  • codeigniter中文手册
  • php数组查询
  • 城建税减征50%
  • 2020注册谷歌账号方法
  • 图像处理入门
  • 软考软件设计师考试时间
  • 小规模纳税人印花税减半征收政策
  • 不得抵扣增值税的情形有哪些
  • 外地工程预缴的个人所得税是什么申报
  • 别人公司过账用自己的银行卡会查吗
  • 招聘招一个人爱我图片
  • 一般纳税人企业所得税怎么征收
  • 工程分包合同协议书
  • 上年未结转的成本今年可以结转吗
  • 计提贷款损失准备的意义
  • 只有发票没有银行回单怎么做账
  • 企业的借款利息费用,扣除标准是?
  • 支付收购股权款如何做账
  • 付境外股东股利要交什么税
  • 费用会计处理
  • 工伤 保险赔付
  • 持有至到期投资改名为
  • 新买的车没有牌能上路吗
  • 记账凭证的基本要素包括哪些
  • sqlserver存储过程怎么查看
  • vista windows
  • 安装office提示
  • ubuntu16.04安装拼音输入法
  • win10专业装机版
  • winxp系统用户不见了
  • ubuntu系统安装程序
  • linux ssh免密码
  • windows8咋关机
  • win8的ie浏览器
  • 微软企业官网
  • Cocos2dx 3.2 + vs2012 + win7 改变面黑色背景的大小
  • angular之ng-template模板加载
  • 用python循环语句
  • 创建ie浏览器
  • js实现倒计时60s
  • 批处理循环执行批处理
  • shell 命令执行顺序
  • linux重启关闭打开达梦数据库
  • shell脚本中执行命令语句
  • android混淆后怎么破解
  • 国家税务局河南省税务总局官网
  • 经济补偿金如何计税
  • 天津国税发票查询真伪查询
  • 冀地是哪里
  • 审计现金盘点表怎么填
  • 电子税务局都能完成哪些功能
  • 小规模税控盘全额抵扣怎么做分录
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设