杂谈:js事件轮询

3 阅读1分钟

背景

作为前端开发者,关于事件轮询,是一个老生常谈的问题,网上也已经说的很全面了。

今天在面试时,被问到如果一个页面里,js只有一个 setTimeout ,没有其他任何代码,那么浏览器里实际上发生了什么。

回答

js运行在浏览器的渲染主线程,会存在一个预编译的过程,即变量、函数提升等等,上述js只存在一个 setTimeout,也是会走这个过程只不过,没有东西罢了,然后进行执行,遇到setTimeout会将回调放入宏队列。因为没有同步代码及微队列任务要执行,因此将setTimeout的回调取出并执行。

追问

setTimeout执行前这个阶段浏览器做了什么,就一直在等着吗?

回答

浏览器开启了后台(计时线程)计时,计时结束后,setTimeout才会被加入到执行队列,若无同步代码要处理,则主线程处于空闲状态,同时会不断检查执行队列是否为空(即使当前只有一行代码),此外,浏览器 60帧/s 的刷新不会间断。

追问这里,个人理解是这样,但是感觉使是不太全可能,也不太有自信,路过各路道友可以留言一起讨论下