事件循环机制

解答: console.log()是同步任务(便可以当即执行的任务),setTimeout是异步任务(不会当即执行的事件任务)。浏览器

常见的异步操做:异步

  • Ajax
  • DOM的事件操做
  • setTimeout
  • Promise的then方法
  • Node的读取文件

异步任务分为宏任务和微任务:函数

宏任务:script(全局任务), setTimeout, setInterval, setImmediate, I/O, UI renderingspa

微任务:process.nextTick, Promise.then(), Object.observe, MutationObserver3d

 

因此,对以上的解析是:日志

  • 从全局任务入口,首先打印日志 1
  • 遇到宏任务 setTimeout,交给异步处理模块,咱们暂且先记为 setTimeout1
  • 再次遇到宏任务 setTimeout,交给异步处理模块,咱们暂且先记为 setTimeout2
  • 顺序执行,打印日志 4
  • 此时同步任务已执行完毕,读取宏任务队列的任务,先执行 setTimeout1的回调函数,由于定时器的等待时间为 0秒,因此会直接输出 2,可是 W3C在 HTML标准中规定,规定要求 setTimeout中低于 4ms的时间间隔算为 4ms
  • 因为浏览器在执行以上三步时,并未耗时好久,因此当宏任务 setTimeout1执行完时, setTimeout2的等待时间并未结束,因此在 2秒后打印日志 3,实际上并未等待2秒。

入栈与出栈

解答:栈是先进后出code

相关文章
相关标签/搜索