贝利信息

javascript定时器如何使用_setTimeout和setInterval有什么区别【教程】

日期:2026-01-23 00:00 / 作者:夢幻星辰
setTimeout只执行一次,适合防抖、按钮禁用等场景;需递归调用才能实现循环;setInterval会持续执行直至手动清除,易因回调耗时导致堆积和内存泄漏;推荐用递归setTimeout替代setInterval以保障节奏稳定和生命周期可控。

setTimeout 只执行一次,别指望它自动循环

你写 setTimeout(fn, 1000),就是告诉浏览器:“1 秒后调用 fn 一次,之后就没了”。它不会自己续费,也不会管你有没有清掉——它执行完就自动释放资源。

setInterval 会一直跑,直到你亲手叫停

setInterval(fn, 1000) 的意思是:“从现在起,每 1 秒就尝试调用 fn 一次”,它不看上一次是否结束、有没有报错、甚至页面是否还活着。

为什么推荐用递归 setTimeout 替代 setInterval?

不是为了炫技,而是为了解决真实问题:时间漂移、回调堆积、难以调试。

清除定时器时最容易忽略的三个细节

90% 的内存泄漏和重复执行 bug,都出在这几步。

实际项目里,只要涉及轮询、心跳、倒计时这类“重复但要求节奏稳”的逻辑,优先写递归 setTimeout。那个看似省事的 setInterval,往往在压力测试或弱网环境下第一个暴露问题。