事件循环机制

45 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第18天,点击查看活动详情

image.png

  • 堆(Heap): 堆表示一大块非结构化的内存区域,对象,数据被存放在堆中

  • 栈(Stack): 栈在javascript中又称执行栈,调用栈,是一种后进先出的数组结构,

    • Javascript 有一个 主线程(main thread)和 调用栈(或执行栈call-stack),主线各所有的任务都会被放到调用栈等待主线程执行。
    • JS调用栈采用的是后进先出的规则,当函数执行的时候,会被添加到栈的顶部,当执行栈执行完成后,就会从栈顶移出,直到栈内被清空。
  • 队列(Queue): 队列即任务队列Task Queue,是一种先进先出的一种数据结构。在队尾添加新元素,从队头移除元素。

image.png

主线程

image.png

所有的同步任务都是在主线程里执行的,异步任务可能会在macrotask或者microtask里面

  • 同步任务: 指的是在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务。
  • 异步任务: 指的是不进入主线程,某个异步任务可以执行了,该任务才会进入主线程执行。

微任务(micro task)

  • new Promise().then(回调)
  • process.nextTick(node独有)
  • async
  • await
  • process.nextTick(node)
  • mutationObserver(html5新特性)

宏任务(macro task)

  • script(整体代码)
  • setTimeout
  • setInterval
  • setImmediate(node独有)
  • I/O
  • UI render

在同一个上下文中,总的执行顺序为同步代码—>microTask—>macroTask

具体来说,浏览器会不断从task队列中按顺序取task执行,每执行完一个task都会检查microtask队列是否为空(执行完一个task的具体标志是函数执行栈为空),如果不为空则会一次性执行完所有microtask。然后再进入下一个循环去task队列中取下一个task执行,以此类推。

image.png

image.png