本文将介绍我本身对JS Event Loop
和 宏任务、微任务
的理解。
二话不说先上图:
promise
接下来将会针对此图讲解什么是Event Loop 什么事宏任务和微任务(其实聪明的大家经过图大致也能了解的是吧~),再此以前先简单介绍几个概念。浏览器
JavaScript的单线程,与它的用途有关。做为浏览器脚本语言,JavaScript的主要用途是与用户互动,以及操做DOM。这决定了它只能是单线程,不然会带来很复杂的同步问题。好比,假定JavaScript同时有两个线程,一个线程在某个DOM节点上添加内容,另外一个线程删除了这个节点,这时浏览器应该以哪一个线程为准?异步
因此,为了不复杂性,从一诞生,JavaScript就是单线程,这已经成了这门语言的核心特征,未来也不会改变。函数
为了利用多核CPU的计算能力,HTML5提出 Web Worker 标准,容许JavaScript脚本建立多个线程,可是子线程彻底受主线程控制,且不得操做DOM。因此,这个新标准并无改变JavaScript单线程的本质。(此段来自阮老师)oop
任务队列
(Task Queue)的任务。Event Table
执行,而后当执行结束会把回调函数推入到Event Queue
,而后等待主线程的结束。对于微任务的异步会推入到另一个Event Queue
,等待主线程的结束。Event Queue
)中的event拉到主线程执行。EventLoop
了。setTimeout(function() { console.log('setTimeout'); }, 0) new Promise(function(resolve) { console.log('promise 1'); resolve(); console.log('promise 2') }).then(function() { console.log('promise then'); }) console.log('1');
输出结果:promise 1 、promise 2 、1 、promise then 、setTimeout
解释:线程
eventloop中处理微任务和宏任务的逻辑也是不一样厂商按照规范实现的 jsvm。code
宏任务 | 浏览器 | Node |
---|---|---|
setTimeout | √ | √ |
setInterval | √ | √ |
setImmediate | x | √ |
requestAnimationFrame | √ | x |
微任务 | 浏览器 | Node |
---|---|---|
process.nextTick | x | √ |
MutationObserver | √ | x |
Promise.then catch finally | √ | √ |
来自个人简书的文章:Event Loop、 宏任务和微任务server