js【详解】event loop(事件循环/事件轮询)

event loop 是异步回调的实现原理

js 代码的执行过程

  • 从前到后,一行一行执行
  • 如果某一行执行报错,则停止下面代码的执行
  • 先把同步代码执行完,再执行异步

event loop 图解

以下方代码为例:

在这里插入图片描述

第1步 将第 1 行代码放入调用栈

将要执行第1行代码放入调用栈(call stack)中

在这里插入图片描述

第2步 执行第 1 行代码,清空调用栈

执行第1行代码,在浏览器中打印 Hi,并清空调用栈
在这里插入图片描述
在这里插入图片描述

第3步 将第 3 行代码放入调用栈

在这里插入图片描述

第4步 执行第 3 行代码,设置定时器,清空调用栈

执行第3行代码,发现是一个定时任务,于是在 Web APIs 中设置一个回调函数为 cb 1 的定时器,清空调用栈
在这里插入图片描述

第5步 将第 7 行代码放入调用栈

在这里插入图片描述

第6步 执行第 7 行代码,清空调用栈,开始事件轮询

执行第7行代码,在浏览器中打印 Bye,并清空调用栈
在这里插入图片描述
此时同步代码已执行完,开始 DOM 渲染(此范例中没有 DOM 渲染)
待 DOM 渲染完成后,开始事件轮询(即不断询问回调队列中是否存在可执行代码)
在这里插入图片描述
事件轮询会一直进行,直到整个js代码不再运行(如页面被销毁)。

第7步 将定时器的回调函数放入回调队列

本例中,第3行代码设置的定时器是 5 秒,则从第4步设置定时器开始记时,5秒后,将 Web APIS 中的定时器的回调函数放入回调队列(Callback Queue)中

在这里插入图片描述

第8步 事件轮询将定时器的回调函数放入调用栈

定时器的回调函数放入回调队列的那一刻,就会被事件轮询到(若回调队列已有多个回调函数,则会按先进先出的原则依次放入调用栈),并放入调用栈
在这里插入图片描述

第9步 将第 4 行代码放入调用栈

在这里插入图片描述

第10步 执行第 4 行代码,移除调用栈中的第 4 行代码

执行第4行代码,在浏览器中打印 cb1,将第4行代码从调用栈中移除
在这里插入图片描述
在这里插入图片描述

第11步 清空调用栈,全部代码执行完毕

因回调函数 cb1内的代码已执行完毕,函数cb1 也被移出调用栈

在这里插入图片描述

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

朝阳39

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值