1、什么是事件循环
事件循环就是消息队列,是浏览器渲染主线程的工作方式;
过去将消息队列,简单的分为宏任务
和微任务
两种队列,而对于现在复杂多变的浏览器环境,显然这种处理方式已经不能满足使用,取而代之的是一种更加灵活多变的处理方式;
W3C给出的解释是:
每个任务有不同的类型,相同类型的任务会被放入同一个执行队列中,不同的任务可以隶属于不同的队列,不同的任务队列有不同的执行优先级
,在一次事件循环中,浏览器自行决定取哪一个任务队列,但是浏览器必须有一个微任务队列,并且微任务队列中的任务执行级别最高,优先执行微任务;
宏任务中的计时器 是不能达到精准执行的,即使在当前执行的队列中没有其他任务执行时,当前任务的执行也是有略微的时间差别
如: setTimeout(() => {}, 5000)
a、只能说该任务最小执行时间为 5000
毫秒后执行,因为 js
执行的计时器是调用的浏览器函数,而浏览器函数的执行也是需要时间的;
b、若当前任务之前有其他任务,需要等待其他任务执行完成之后才能执行该任务,这个时间是大于 5000 毫秒
的
c、计时器需要 相同的任务队列 执行完毕,即空任务时候才能去执行计时器;