前端

JS JavaScript事件循环机制

2019-01-19  本文已影响48人  LHH大翰仔仔

JS JavaScript事件循环机制

首先区分进程和线程

浏览器的渲染进程是多线程的
  1. GUI渲染线程
  2. JS引擎线程
  3. 事件触发线程
  4. 定时触发器线程
  5. 异步HTTP请求线程

事件循环机制

上图解释:

宏任务(macrotask)和微任务(microtask)

先看一段代码的执行结果:

console.log('script start');

setTimeout(function() {
  console.log('setTimeout');
}, 0);

Promise.resolve().then(function() {
  console.log('promise1');
}).then(function() {
  console.log('promise2');
});

console.log('script end');

执行结果: script start , script end , promise1 , promise2 , setTimeout

JS中分为两种任务类型:macrotaskmicrotask,在ECMAScript中,microtask称为jobsmacrotask可称为task

  1. 每一个task会从头到尾将这个任务执行完毕,不会执行其它
  2. 浏览器为了能够使得JS内部taskDOM任务能够有序的执行,会在一个task执行结束后,在下一个 task 执行开始前,对页面进行重新渲染 (task->渲染->task->...)
  1. 也就是说,在当前task任务后,下一个task之前,在渲染之前
  2. 所以它的响应速度相比setTimeoutsetTimeouttask)会更快,因为无需等渲染
  3. 也就是说,在某一个macrotask执行完后,就会将在它执行期间产生的所有microtask都执行完毕(在渲染前)
分别什么样的场景会形成macrotask和microtask呢?

补充:在node环境下,process.nextTick的优先级高于Promise,也就是可以简单理解为:在宏任务结束后会先执行微任务队列中的nextTickQueue部分,然后才会执行微任务中的Promise部分。

总结下运行机制:

如图:


欢迎关注
上一篇下一篇

猜你喜欢

热点阅读