关于JavaScript中的宏任务、微任务和同步、异步
JavaScript中的宏任务、微任务和同步、异步
在JavaScript中,任务的执行方式分为宏任务和微任务,同时代码的执行也分为同步和异步,这些概念会影响到JavaScript代码的执行顺序和性能。本文将详细介绍宏任务、微任务、同步和异步的概念,并且通过代码示例来演示它们之间的关系。
宏任务和微任务
在JavaScript中,事件循环是负责管理任务队列的机制。每个任务都可以被认为是一个宏任务或者一个微任务。
宏任务
宏任务(Macrotasks)是执行时间较长的任务,例如setTimeout、setInterval和DOM事件等。当浏览器执行完一个宏任务时,会检查是否有微任务需要执行,如果有则先执行微任务栈中的任务,直到微任务队列为空为止。
微任务
微任务(Microtasks)是执行时间较短的任务,例如Promise的回调函数、MutationObserver和process.nextTick等。当创建一个微任务时,它会被添加到微任务队列中,在下一次事件循环之前执行。当宏任务中有多个微任务时,它们会按照添加的顺序依次执行。
同步和异步
同步代码是按照书写顺序依次执行,每个任务都得等待前一个任务完成后才能继续。异步代码不会阻塞后面任务的执行,它会在之后的某个时间点被执行。
同步
同步代码是按照顺序执行的,当一个程序中有多个同步任务时,一定要按照它们书写的顺序依次执行。
console.log('start');
for (let i = 0; i < 5; i++) {
console.log('sync task', i);
}
console.log('end');
上述代码中,同步任务都是按照顺序依次执行的。当执行完循环后,控制台会依次输出:
start
sync task 0
sync task 1
sync task 2
sync task 3
sync task 4
end
异步
异步任务在执行过程中并不会阻塞其他任务,而是将任务添加到任务队列中,在下一轮事件循环中执行。
console.log('start');
setTimeout(() => {
console.log('async task');
}, 2000);
console.log('end');
上述代码中,setTimeout函数是一个异步任务,它将“async task”添加到任务队列中,在指定的时间(2000毫秒)后执行。执行结果如下:
start
end
async task
宏任务和微任务的执行顺序
由于宏任务和微任务各自拥有一个任务队列,它们之间的执行顺序也存在差异。
console.log('start');
setTimeout(() => {
console.log('async task');
});
Promise.resolve().then(() => {
console.log('micro task');
});
console.log('end');
上述代码中,我们使用了setTimeout和Promise两个API,同时在控制台打印了三个信息。执行结果如下:
start
end
micro task
async task
当执行到setTimeout函数时,它会向宏任务队列中添加一个任务,而Promise.resolve().then()则会添加一个微任务。当异步任务全部添加到对应的队列之后,事件循环开始从宏任务队列中取出任务,执行完成之后,才去执行微任务队列中的任务。
结论
在JavaScript中,任务的执行方式包括宏任务、微任务和同步、异步。了解它们之间的关系和执行顺序,可以帮助我们更好地理解JavaScript代码的执行过程和性能优化。在实际开发中,我们需要根据场景的不同选择不同的任务类型,以便提高应用程序的性能和用户体验。
转载自:https://juejin.cn/post/7241473344469401657