JavaScript事件循环中,微任务/宏任务的由来?

520 阅读2分钟

当我学习JavaScript的时候,有两个次总是不断地出现:宏任务微任务,大家总是习惯把setTimeout相关的叫做宏任务而把Promise相关的叫做微任务。

虽然我看完各种文章后,能死记硬背的写出它们的执行顺序,但总有一个疑问:

  • 宏任务、微任务为什么这么叫,它们到底宏/微在哪里?

甚至在MDN的事件循环页面,也并没有提到宏任务、微任务这两个词。

这这两天的学习中,我大概找到了问题的答案,小孩没娘说来话长...

我们知道,JavaScript代码是运行于浏览器或Node.js环境中的,把他们叫做JavaScript的宿主;

  1. 当宿主得到JavaScript代码时,就把代码传递到JS引擎去执行,这很好理解;

  2. 当宿主环境遇到一些事件(点击事件等)时,会传递一段代码给JavaScript引擎执行;

  3. 宿主环境还会提供API给JavaScript调用(如setTimeout()),以使代码在特定的时机执行;

我们可以理解为:JavaScript引擎常驻与内存中,等待宿主的任务;

在ES3及以前,JavaScript本身不具备异步执行能力,此时就是第1种情况,代码顺序执行,也就是宿主发起的任务顺序执行;

而在ES5以后,Primise的出现使得JavaScript本身也可以发起任务,不需要宿主的调用;

而宏任务/微任务真正的来源是JSC引擎的术语

宿主发起的任务称为宏任务(macroTacks),JavaScript引擎发起的任务称为微任务(microTasks)

我把他们理解成宏观/微观两个词,宏观上,代码的执行依赖宿主调用JavaScript引擎,所以由宿主发起的任务叫做宏任务;相应的,为了对应和区分,由JavaScript自己发起的任务叫做微任务。微任务是在宏任务运行时产生的,从这个角度也讲得通。

到这里,这篇文章就结束了,这里不带大家做题,网上有很多好的文章教你在一堆setTimeout和Promise中找出一条路来。如果你学完事件循环后也和我有相同的疑惑,希望这篇文章能帮到你。

这篇文章的主要内容,是我在winter老师的课里学到的,欢迎你扫码和我一起学习!

如果有其他的见解,请在留言区里和我讨论,谢谢~