JavaScript事件循环(Event Loop)中存在两个不同的任务队列——宏任务队列和微任务队列。
宏任务(MacroTask)是一些比较重的任务,比如script整体代码、setTimeout、setInterval、setImmediate、I/O操作等,它们会被推到宏任务队列中等待执行。
微任务(MicroTask)是一些比较轻量的任务,比如Promise里的then或catch、process.nextTick、MutationObserver等,它们会被推到微任务队列中等待执行。
第一次进入事件循环时,事件循环会先按照顺序执行所有的宏任务,再执行所有微任务。
在执行过程中,产生的微任务还会继续添加到微任务队列的末尾。当宏任务执行完毕后,就会取出微任务队列中的所有任务,按照顺序执行。这个过程会一直重复下去,直到所有的任务都被执行完毕。
总体来说,区分宏任务和微任务是为了控制任务执行的优先级和顺序。宏任务的优先级比微任务要低,当宏任务和微任务都存在时,会先执行微任务。