浏览器版的event loop
是什么
JS引擎执行JS的一个机制:等待任务、执行任务和进入休眠等待更多任务这个几个状态之间的无限循环。流程如上图所示。
为什么
macrotask解决的问题:JS是单线程语言,通过引入消息队列,让主线程处理其他线程或进程的任务。
microtask解决的问题:
消息队列机制不够灵活。如果JS底层想实现一个优先级比较高的监听接口,监听到变化后:若同步执行,则堵塞主线程,影响执行效率;若异步执行,则只能添加到消息队列尾,同时两个宏任务之间可能会被系统级别的宏任务插入,而影响了实时性。
因此,出现了微任务(microtask)。每个宏任务(macrotask)中都包含了一个微任务队列,在执行宏任务的过程中,如果监听有变化,那么就会将该变化添加到微任务列表中,这样就不会影响到宏任务的继续执行,因此也就解决了执行效率的问题。
等宏任务中的主要功能都直接完成之后,这时候,渲染引擎并不着急去执行下一个宏任务,而是执行当前宏任务中的微任务,因为变化的事件都保存在这些微任务队列中,这样也就解决了实时性问题。
总的来说,event loop 提供一种机制让主线程处理其他线程或进程的任务,并优先处理优先级高的任务。
可以做什么
参考