返回

剖析JS执行原理:揭开事件循环、微任务与宏任务的神秘面纱

前端







在单线程的JavaScript世界里,事件循环(Event Loop)像一位勤劳的指挥家,指挥着微任务(Microtask)和宏任务(Macrotask)井然有序地执行。它们共同协作,处理各种任务,确保JavaScript代码平稳运行。

**事件循环:交替运行微任务和宏任务的幕后指挥家** 

事件循环是一个不断循环的过程,它交替运行微任务和宏任务。每次循环,事件循环都会先检查是否有微任务需要执行,如果有,则立即执行它们。当所有微任务执行完毕后,事件循环再检查是否有宏任务需要执行。如果没有宏任务,事件循环就会等待新的任务出现。

**微任务:最优先执行的任务** 

微任务是指那些需要立即执行的任务,例如Promise回调函数、MutationObserver回调函数和事件处理程序。它们比宏任务优先执行,因为它们通常涉及到用户交互或浏览器内部状态的更新。微任务总是先于宏任务执行,这意味着在同一事件循环中,微任务会先执行完毕,然后再执行宏任务。

**宏任务:稍后执行的任务** 

宏任务是指那些不需要立即执行的任务,例如脚本(script)、setTimeout()和setInterval()函数。它们通常涉及到耗时的操作,例如网络请求、文件读取或计算密集型任务。宏任务会在所有微任务执行完毕后执行。如果在执行宏任务时有新的微任务产生,那么这些微任务会在当前宏任务执行完毕后立即执行。

**JavaScript的单线程特性:如何协调不同任务的执行** 

JavaScript是单线程的,这意味着它一次只能执行一个任务。当一个任务正在执行时,其他任务必须等待。为了协调不同任务的执行,JavaScript采用了事件循环机制。事件循环通过交替执行微任务和宏任务,确保所有任务都能得到执行。

**剖析一个真实的JavaScript执行示例** 

为了更直观地理解事件循环的运作方式,让我们来看一个真实的JavaScript执行示例:

console.log('宏任务1');

setTimeout(() => {
console.log('宏任务2');
}, 0);

Promise.resolve().then(() => {
console.log('微任务1');
});

console.log('宏任务3');

MutationObserver(console.log('微任务2'));


在这个示例中,事件循环首先执行宏任务1,然后执行微任务1,接下来是宏任务2,最后是宏任务3和微任务2。虽然宏任务2在宏任务1之后执行,但由于微任务1和微任务2的优先级更高,因此它们在宏任务2之前执行。

**掌握JS执行原理:编写更高效、更流畅的代码** 

掌握JS执行原理,可以帮助你编写更高效、更流畅的代码。例如,你可以通过合理安排微任务和宏任务的执行顺序,来提高代码的性能和响应速度。此外,你还可以通过避免在事件循环中执行耗时的任务,来防止浏览器卡顿。