目录

  1. 事件轮询

从面试题看 JS 事件循环与 macro micro 任务队列

事件轮询

同步任务 指的是,在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务;
异步任务 指的是,不进入主线程、而进入”任务队列”(task queue)的任务,等待同步任务执行完毕之后,轮询执行异步任务队列中的任务
macrotask队列 等同于我们常说的任务队列,macrotask是由宿主环境分发的异步任务,事件轮询的时候总是一个一个任务队列去查看执行的,”任务队列”是一个先进先出的数据结构,排在前面的事件,优先被主线程读取。
microtask微任务,是由js引擎分发的任务,总是添加到当前任务队列末尾执行。另外在处理microtask期间,如果有新添加的microtasks,也会被添加到队列的末尾并执行。注意与setTimeout(fn,0)的区别:
  setTimeOut(fn(),0) 指定某个任务在主线程最早可得的空闲时间执行,也就是说,尽可能早得执行。它在”任务队列”的尾部添加一个事件,因此要等到同步任务和”任务队列”现有的事件都处理完,才会得到执行。
所以我们可以得到js执行顺序是:

开始 -> 取第一个task queue里的任务执行(可以认为同步任务队列是第一个task queue) -> 取 microtask 全部任务依次执行 -> 取下一个task queue里的任务执行 -> 再次取出microtask全部任务执行 -> … 这样循环往复