JS事件循环机制

48 阅读1分钟

JavaScript语言的一大特点就是单线程,也就是说,同一个时间只能做一件事。但是这并不意味着单线程就是阻塞,而实现单线程非阻塞的方法就是事件循环。

事件循环

js中所有的任务可以分为同步任务和异步任务,同步任务是立即执行的任务,同步任务一般会直接进入到主线程中执行;而异步任务,就是异步执行的任务,异步任务会通过任务队列(先进先出)的机制来进行协调。同步和异步任务分别进入不同的执行环境,同步的进入主线程,即主执行栈,异步的进入任务队列。主线程内的任务执行完毕为空,会去任务队列读取对应的任务,推入主线程执行。 这种不断重复就是我们说的 Event Loop (事件循环)。

执行机制

  1. 执行一个宏任务(栈中没有就从事件队列中获取);
  2. 执行过程中如果遇到微任务,就将它添加到微任务的任务队列中;
  3. 宏任务执行完毕后,立即执行当前微任务队列中的所有微任务(依次执行);
  4. 当前宏任务执行完毕,开始检查渲染,然后GUI线程接管渲染;
  5. 渲染完毕后,JS线程继续接管,开始下一个宏任务(从事件队列中获取)。

宏任务和微任务

宏任务主要包含:script( 整体代码)、setTimeout、setInterval、I/O、UI 交互事件、setImmediate(Node.js 环境)
微任务主要包含:Promise、MutaionObserver、process.nextTick(Node.js 环境)

new Promise 是同步执行的,promise.then 里面的回调才是异步的。