任务调度

搜索文档
为什么 setTimeout(0) 不是真的 0 毫秒?浏览器藏了这些“小心思”
程序员的那些事· 2025-09-14 19:04
以下文章来源于算法爱好者 ,作者小蒜 算法爱好者 . 算法是程序员的内功!「算法爱好者」专注分享算法相关文章、工具资源和算法题,帮程序员修炼内功。 昨天在 HN 刷到的一篇,之前没注意,分享给大家。 即便你已经使用 JavaScript 有一段时间了,可能也会对 setTimeout(0) 并非真的"延迟 0 毫秒执行"感到惊讶。 实际上,它可能要等 4 毫秒后才会运行。 const start = performance.now() setTimeout(() => { // Likely 4ms console.log(performance.now() - start) }, 0) 大约十年前,我还在微软 Edge 团队工作时,有人向我解释过,浏览器这么做是为了防止"滥用"。也就是说,现在很多网站会频繁调用 setTimeout , 为了避免耗尽用户设备的电量或阻碍页面交互,浏览器设置了一个特殊的"限制"——最小延迟为 4 毫秒。 这也能解释为什么有些浏览器会针对使用电池供电的设备进一步加强限制(比如旧版 Edge 会把延迟调到 16 毫秒),或者对后台标签页的限制更严格 (Chrome 甚至会调到 1 ...