任务队列JS分为同步任务和异步任务。同步任务在主线程上执行,形成一个执行栈。在主线程之外,事件触发线程管理着一个任务队列(包括宏任务队列和微任务队列),只要异步任务有运行结果,就会在任务队列中放入一个事件。一旦执行栈中的所有同步任务都执行完毕(此时JS引擎空闲),系统会读取任务队列,将可运行的异步任务添加到可执行栈中,开始执行宏任务task(也称为macroTask),可以理解为栈每次执行的代码都是一个宏任务。为了让JS内部任务和DOM任务能够有序执行,浏览器会在一个任务执行结束后,下一个(宏)任务开始执行前重新渲染页面。Task主要包括:script(整体代码)、setTimeout、setInterval、I/O、UI交互事件、postMessage、MessageChannel、setImmediate(Node。执行结束后立即执行的任务。即当前任务之后,下一个任务之前task,并且在渲染之前。所以它的响应速度会比setTimeout快(setTimeout是一个task),因为不需要等待渲染。也就是说,一个macrotask执行后,其执行过程中产生的所有microtask都会被执行(渲染前)。microtask主要包括:Promise.then、MutaionObserver、process.nextTick(Node.js环境)执行顺序清空执行栈清空microtask队列取出一个macrotask队列中的事件,重复上面2和3在执行栈中等待
