1.什么是事件循环?
js 是一种单线程语言,只有一条通道,那么在任务多的情况下,就会出现堵塞,这种情况下就产生了 多线程,那么就产生了同步任务和异步任务。说白了这些任务就组成了事件循环机制。
同步任务: 在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务。是由 js 执行栈/回调栈执行的
异步任务: 不进入主线程、而进入任务队列的任务,当主线程中的任务运行完成了,才会从任务队列中取出异步任务,放入主线程中执行
2.什么是宏任务?什么是微任务?
宏任务:script、setTimeout、setInterval、postMessage、MessageChannel、及Node.js 环境中的setImmediate.
微任务:Promise.then、Object.observe、MutationObserver、及Node.js 环境中的process.nextTick.
3.任务的执行顺序?
有人说宏任务先于微任务执行,也有人说微任务先于宏任务执行
其实,由于整个 script 身就是一个大的宏任务,所以在执行任务时,肯定是执行script这个大的宏任务里面的代码,因此,我们也可以说是宏任务优先于微任务
但是如果我们忽略script这个大的宏任务,仅仅只讨论script里包含的任务代码块,那么任务的执行顺序就一定是微任务优先于宏任务
在这里,我们就先忽略script,执行顺序就为: 同步任务 ---> 微任务 ---> 宏任务
4.那么宏任务和微任务的区别是什么呢?
首先,宏任务和微任务的执行时机是不同的。
宏任务会在主线程执行完毕后被执行,而微任务会在主线程执行完毕之前立即执行。
其次,宏任务和微任务的优先级也是不同的。在 JavaScript 中,微任务的优先级比宏任务高,也就是说,如果微任务队列和宏任务队列中都有任务需要执行,微任务会先于宏任务执行。
另外,宏任务和微任务对于 JavaScript 事件循环的影响也是不同的。宏任务会触发事件循环,而微任务不会触发事件循环,而是在主线程上的同步任务执行完毕后立即执行。
此外,宏任务和微任务在实际应用中有着不同的用途。宏任务通常用于与浏览器渲染相关的任务,如 setTimeout 和 requestAnimationFrame,而微任务通常用于异步操作,如 Promise.then 和 async/await。
通过理解宏任务和微任务的区别,我们可以更好的优化代码的性能,例如避免在微任务中执行大量耗时的操作。
总之,宏任务和微任务是 Javascript 中非常重要的概念,对于更好的理解 JavaScript 的执行机制和优化代码的性能是非常有帮助的。