当我学习JavaScript的时候,有两个次总是不断地出现:宏任务和微任务,大家总是习惯把setTimeout相关的叫做宏任务而把Promise相关的叫做微任务。
虽然我看完各种文章后,能死记硬背的写出它们的执行顺序,但总有一个疑问:
- 宏任务、微任务为什么这么叫,它们到底宏/微在哪里?
甚至在MDN的事件循环页面,也并没有提到宏任务、微任务这两个词。
这这两天的学习中,我大概找到了问题的答案,小孩没娘说来话长...
我们知道,JavaScript代码是运行于浏览器或Node.js环境中的,把他们叫做JavaScript的宿主;
-
当宿主得到JavaScript代码时,就把代码传递到JS引擎去执行,这很好理解;
-
当宿主环境遇到一些事件(点击事件等)时,会传递一段代码给JavaScript引擎执行;
-
宿主环境还会提供API给JavaScript调用(如
setTimeout()),以使代码在特定的时机执行;
我们可以理解为:JavaScript引擎常驻与内存中,等待宿主的任务;
在ES3及以前,JavaScript本身不具备异步执行能力,此时就是第1种情况,代码顺序执行,也就是宿主发起的任务顺序执行;
而在ES5以后,Primise的出现使得JavaScript本身也可以发起任务,不需要宿主的调用;
而宏任务/微任务真正的来源是JSC引擎的术语
宿主发起的任务称为
宏任务(macroTacks),JavaScript引擎发起的任务称为微任务(microTasks)。
我把他们理解成宏观/微观两个词,宏观上,代码的执行依赖宿主调用JavaScript引擎,所以由宿主发起的任务叫做宏任务;相应的,为了对应和区分,由JavaScript自己发起的任务叫做微任务。微任务是在宏任务运行时产生的,从这个角度也讲得通。
到这里,这篇文章就结束了,这里不带大家做题,网上有很多好的文章教你在一堆setTimeout和Promise中找出一条路来。如果你学完事件循环后也和我有相同的疑惑,希望这篇文章能帮到你。
这篇文章的主要内容,是我在winter老师的课里学到的,欢迎你扫码和我一起学习!
如果有其他的见解,请在留言区里和我讨论,谢谢~