Event Loop

250 阅读1分钟

前言

javaScript 用来与浏览器进行交互,被设计为 单线程非阻塞 的脚本语言。

  • 单线程指在代码执行的任何时候,都只有一个线程来处理任务。

  • 非阻塞在js中指js引擎遇到一个异步事件后并不会一直等待返回结果,而是将这个事件挂起,待异步任务结果返回再根据规则执行相应的回调。

事件循环机制

首先,js解析器会从上到下解析js代码,将所有任务压如执行栈中,然后从头开始执行。当遇到同步任务时,依次执行,如果遇到异步任务,则会将该事件挂起js,待异步事件返回结果后会将这个事件加入到事件队列。待执行栈中任务全部执行完毕,主线程在执行异步任务。

异步任务分类

以上的事件循环只是一个宏观的表述,其实异步任务也有不同。异步任务分为 宏任务微任务,两者任务在执行优先级上也有出入(微任务优先与宏任务)。

  • Macro Task(宏任务)

    • setInterval()
    • setTimeout()
  • Micro Task(微任务)

    • new Promise()
    • new MutaionObserver()

前面所说,在异步任务返回结果后,js解析器会将该事件回调加入到事件队列中,实际上会根据该事件的类型加入到宏任务队列或者微任务队列中去。并且在调用栈为空时,优先执行微任务队列事件,后执行宏任务队列事件。

同步与异步,阻塞与非阻塞