首先我们要知道js语言的特点,即js是一种单线程解释型语言,也就是说同一时间只能做一件事。事件循环为了协调事件绑定、用户交互、js脚本、UI渲染、网络请求等行为,防止主线程被阻塞,事件循环(EventLoop)方案应运而生,即事件循环机制。任务队列事件循环是通过任务队列机制来协调的,一个EventLoop可以有一个或多个任务队列。EventLoop中各个循环操作的任务处理关键步骤如下:js分为同步任务和异步任务。同步任务在主线程上执行,形成一个执行栈。在主线程之外,事件触发线程管理着一个任务队列,只要异步任务有运行结果,就会在任务队列中放入一个事件。一旦执行栈中的所有同步任务执行完毕(此时JS引擎空闲),系统会读取任务队列,将可运行的异步任务加入到可执行栈中,需要了解以下内容才能开始执行这一步:一个宏任务可以理解为执行栈每次执行的代码就是一个宏任务(包括每次从事件队列中获取事件回调放入执行栈执行的代码)宏任务队列可以有多个宏任务。微任务执行后,查看微任务队列。如果有微任务,则所有微任务将首先执行。microtask执行完后,会执行下一个macrotask,这样就形成了一个事件循环。机制macrotasks包括:script(整体代码)setTimeoutsetIntervalajax请求DOM事件绑定(UI交互事件)I/OsetImmediate(Node.js环境)microtasks可以理解为执行栈中当前任务执行后立即执行的任务。也就是说当前task任务之后,下一个task之前,渲染前的microtask队列中只有一个microtask,必须在setTimeout,setInterval,DOM事件绑定(UI交互事件)等回调之前执行.宏任务的回调微任务只有在微任务队列中的所有微任务都执行完后才会执行。微任务包括:Promise.then()Object.observeprocess.nextTick(Node.js环境)运行机制在事件循环中,每一次循环运行都称为tick。每个tick的任务处理模型比较复杂,但关键步骤如下:执行一个宏任务(如果不在栈中则从事件队列中获取)。如果在执行过程中遇到微任务,则将其添加到该微任务的任务队列中的宏任务执行完毕后,立即执行当前微任务队列中的所有微任务(顺序执行),开始下一个宏任务(从事件队列中获取)
