事件循环

111 阅读1分钟

js是一个单线程的语言,在浏览器这个环境里,除了提供上下文环境,还有一些webapi和一些任务队列,不同的队列拥有不同的优先级,而事件循环eventloop就是不断地检查执行栈是不是空 的,然后把任务队列的任务推到执行栈去执行。

1 RAF回调队列

浏览器的渲染是一帧一帧的,一般是60hz, 在宏任务切换执行栈的时候,间隙的执行requestAnimationFrame,

动画回调会一直执行,直到队列中所有的任务都完成,如果在动画内部又有动画回调,它们会在下一帧执行。

2 宏任务队列

​ 当用户声明一个setTimeout(alertFunc, t),浏览器会执行一个计时器,并在传入的t时间,把任务推入任务队列,在执行栈是空的时候执行,每次只是执行一个任务,当新的任务进来,就添加到队列尾部

3 微任务队列

一般的promise的then,catch是微任务,微任务里如果有微任务也是立刻执行的,new 一个promise的代码是同步的

function loop(){

Promise.resolve().then(loop)

}

上述代码会使浏览器阻塞,因为微任务的执行同样也是一直执行,直到队列为空,但是,如果处理微任务的过程中有新的微任务加进来,添加的速度比执行快,那么就会永远执行微任务,事件环会阻塞,直到队列完全清空,这就是它阻塞渲染的原因。