返回

JavaScript中的宏任务、微任务与同步、异步

前端

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代码的性能,应该尽量避免使用宏任务和同步代码,而应该使用微任务和异步代码。