什么是Event Loop

169 阅读2分钟

一、进程和线程

  • 进程
    资源分配的最小单位;应用程序的执行实例,每一个进程都是由私有的虚拟地址空间、代码、数据和其它系统资源所组成;进程拥有独立的堆栈空间和数据段,每当启动一个新的进程必须分配给他独立的地址空间,建立众多的数据表来维护它的代码段、堆栈段和数据段。
  • 线程
    程序执行的最小单位;线程是进程内的一个独立执行单元,在不同的线程之间是可以共享进程资源的;线程拥有独立的堆栈空间,但是共享数据段,他们彼此之间使用相同的地址空间,共享大部分数据,比进程更节俭,开销比较小,切换速度比进程快,效率高。

二、同步任务和异步任务

  • 同步任务
    同步任务就是在主线程上排队执行的任务,智能执行完一个再执行下一个
  • 异步任务
    异步任务则不进入主线程,而是先在event table中注册函数,当满足触发条件后,才可以进入任务队列来执行。只有任务队列通知主线程说,我这边异步任务可以执行了,这个时候此任务才会进入主线程执行。
console.log('a')
setTimeout(() => {
    console.log('b')
}, 0)
console.log('c')
// a c b

三、宏任务和微任务

  • 宏任务
    • setTimeout
    • setInterval
    • setImmediate
    • MessageChannel
    • requestAnimationFrame
    • I/O
    • UI交互事件
  • 微任务
    • Promise.then
    • MutationObserver
    • Object.observe
    • process.nextTick

执行方式:执行一个宏任务,过程中遇到微任务时,将其放到微任务的事件队列里,当前宏任务执行完后,会查看微任务的事件队列,依次执行里面的微任务。如果还有宏任务的话,再重新开启宏任务

console.log('1')
setTimeout(() => {
  console.log('2')
}, 1000)
new Promise((resolve, reject) => {
  setTimeout(() => {
    console.log('3')
  }, 0)
  console.log('4')
  resolve()
  console.log('5')
}).then(() => {
  console.log('6')
})
console.log('7')
// 运行结果
1
4
5
7
6
3
2

通俗的理解为,首先执行script(整体代码)宏任务,从上往下执行,遇到宏任务放入宏任务队列,遇到微任务放入微任务队列,执行微任务队列的任务,然后执行宏任务队列的第一个任务