JavaScript定时器仅决定任务入队时间,执行时机取决于主线程空闲、微任务清空及渲染帧完成;setTimeout/setInterval本质是宏任务入队指令,受4ms最小延迟、标签页失焦节流、无优先级队列及阻塞影响,推荐用递归setTimeout和时间戳校准实现精准时序。
JavaScript 定时器不决定“何时执行”,而是决定“何时把任务放进队列”。真正影响执行时机的,是主线程是否空闲、微任务是否清空、以及当前渲染帧是否完成。
setTimeout 和 setInterval 不是“到点就运行代码”,而是告诉浏览器:“请在 delay 毫秒后,把回调函数推入宏任务队列”。这个动作本身很快,但执行要等——等当前同步代码跑完、所有微任务(如 Promise.then)处理完、甚至等 requestAnimationFrame 回调结束之后。
所有定时器回调都作为普通宏任务进入同一队列,只按注册顺序和到期时间先后排队。如果某个定时器回调执行耗时 300ms,它后面所有已到期但尚未执行的定时器都会被顺延,无法插队。
除了定时器自身逻辑,以下情况会显著拖慢任务从入队到执行的时间:
立即学习“Java免费学习笔记(深入)”;
放弃“靠间隔硬等”,改用时间戳主动判断。核心思路是:记录起始时间,每次执行时用 performance.now() 或 Date.now() 计算真实流逝时间,再决定是否做动作、更新 UI 或安排下次调度。
DeepSeek Harness 源码实战:从 pre-execute 到 post-execute:AI Agent 调用工具时背后发生了什么
设计 Skill 系统,这 3 个坑我替你踩过了
ChatGLM-6B+LangChain环境部署与使用实践实用指南
模型“开源”了,就能直接拿来做 Agent 吗?
利用DeepSeek实现方式复杂Git操作的详细过程实用指南
仿生赋能·智创未来:仿生具身智能机器人技术突破与产业生态共建活动成功举办