Javascript 事件循环简述(Event Loop)

前言

大家都知道,Javascript是一门单线程的脚本语言,单线程的设计也是Brendan Eich有意而为之的,这就有人问了: “为什么不设计成多线程的语言?单线程会引起阻塞,效率太低”。那是因为早期的Javascript主要是用来与用户简单交互和操作DOM元素的浏览器脚本语言,如果有多个线程,一个线程修改了某个DOM节点,一个线程删除了某个DOM节点,应该以哪个线程为准?为了避免这些复杂的场景出现,Javascript从设计之初就确定为单线程的脚本语言。

在ES3或者是更早的版本中,Javascript引擎本身是没有异步操作的能力的,浏览器给他什么代码,他就同步的执行什么代码,除此之外,浏览器也会提供一些API, 比如 setTimeout, setInterval, 允许javascript在特定的时间内执行这些API,这些由浏览器发送的任务,我们把它叫做宏观任务(宏任务)-- 这些浏览器提供的API 也可以理解为浏览器发送的任务。

随着Javascript的不断完善,ES5中提出了Promise的概念, 至此,Javascript引擎本身也可以发起任务了,我们把这种由Javascript本身发出的任务,叫做微观任务(微任务)。

事件循环的起始与结尾

当Javascript脚本语言进入浏览器时,对于浏览器来说,这本身就是一个宏任务,这个宏任务中可能包含了三种代码:同步的代码,产生微任务的异步代码(比如Promise中的then,,就会被放到微队列中等待被执行),产生宏任务的异步代码(比如setTimeout等浏览器的API, 与微任务同理)。然后先执行同步的代码,再执行所有的微任务的代码(此时很可能会产生新的微任和宏任务分别放到各自任务队列中,需要把微任务全部执行完才算结束),最后执行宏任务的代码,注意,此时执行的宏任务,是不是和第一次执行的宏任务一样?这就相当于是第二个事件循环的开始了。如下图所示:
在这里插入图片描述

所以说微任务总是先于宏任务执行这样的说法不是很准确,仅限于同一个层级下面才对(比如同时产生了一个微任务和一个宏任务,微任务会在该循环中就会被执行,而产生的宏任务则会放到宏队列中去作为某次循环的开始)。

这算是通篇描述性的语言,也只是个人对Javascrpt事件循环的理解,欢迎指正。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值