返回
JavaScript中的宏任务、微任务与同步、异步
前端
2023-09-20 15:37:37
JavaScript的执行机制主要分为宏任务(macro task)和微任务(micro task),同时JavaScript代码的执行又分为同步(synchronous)和异步(asynchronous)。这些概念会影响到JavaScript代码的执行顺序和性能。
一、宏任务和微任务
宏任务和微任务都是JavaScript中的任务,但它们具有不同的优先级和执行顺序。
-
宏任务 是JavaScript代码中执行的基本任务,包括:
- 脚本执行
- setTimeout()、setInterval()
- UI渲染
- 事件处理
- AJAX请求
- DOM操作
-
微任务 是JavaScript代码中执行的高优先级任务,包括:
- Promise.then()
- MutationObserver
- process.nextTick()
微任务的优先级高于宏任务,因此微任务会在宏任务之前执行。
二、同步和异步
同步和异步是JavaScript代码执行的两种不同方式。
- 同步代码 是按照代码编写的顺序执行的,一个任务必须等待前一个任务执行完毕才能执行。
- 异步代码 是非阻塞的,它可以在不等待前一个任务执行完毕的情况下执行。
JavaScript中的事件处理、AJAX请求、setTimeout()和setInterval()都是异步的。
三、执行顺序
JavaScript代码的执行顺序由执行栈(execution stack)和消息队列(message queue)决定。
- 执行栈 是JavaScript代码执行的堆栈,它存放着正在执行的函数。
- 消息队列 是存放微任务的队列,当执行栈中的任务执行完毕后,消息队列中的微任务会被依次执行。
当JavaScript代码执行时,首先将代码放入执行栈中,然后执行栈中的代码。当执行栈中的代码执行完毕后,消息队列中的微任务会被依次执行。
四、性能影响
宏任务和微任务、同步和异步的概念会影响JavaScript代码的性能。
- 宏任务 的执行会阻塞主线程,因此如果宏任务的执行时间过长,会导致页面卡顿。
- 微任务 的执行不会阻塞主线程,因此即使微任务的执行时间过长,也不会导致页面卡顿。
- 同步代码 的执行会阻塞后续代码的执行,因此如果同步代码的执行时间过长,会导致页面卡顿。
- 异步代码 的执行不会阻塞后续代码的执行,因此即使异步代码的执行时间过长,也不会导致页面卡顿。
因此,为了提高JavaScript代码的性能,应该尽量避免使用宏任务和同步代码,而应该使用微任务和异步代码。