封装通用防抖节流工具类,支持可复用、可配置、可取消、上下文正确;防抖适用于输入搜索等场景,支持immediate和cancel;节流推荐时间戳版,支持leading、trailing、flush、cancel。

封装通用的防抖与节流工具类,核心是让函数具备可复用、可配置、可取消、上下文正确这四个能力。不依赖框架也能用,放进 utils 目录直接 import 即可。
防抖工具函数(debounce)
防抖适用于「等用户操作停稳再响应」的场景,比如搜索框输入、窗口尺寸校验。关键逻辑是:每次触发就清掉旧定时器,重设新定时器;支持立即执行(immediate: true)和手动取消(.cancel())。
- 使用
let timer = null缓存定时器 ID,避免闭包污染 - 用
apply(this, arguments)保证 this 和参数透传,不丢失调用上下文 - 返回函数上挂载
.cancel()方法,组件卸载或主动清理时调用 - immediate 模式下,首次触发立刻执行,后续进入等待期(类似电梯关门即刻启动,之后倒计时)
节流工具函数(throttle)
节流适用于「持续动作中稳定采样」的场景,比如滚动监听、鼠标移动追踪。推荐用时间戳版(比定时器版更精准,不丢帧、不堆积)。
Node.js 可靠编程技能。避免事件循环阻塞、异步陷阱、ESM 兼容问题和内存泄漏。触发词:Node.js 开发、async/await、流处理、性能优化、安全编码。
- 记录上一次执行时间
previous,每次触发计算剩余等待时间remaining - 支持
leading(首次立即执行)和trailing(末次补发)开关,默认都开启 - 提供
.flush()方法:跳过等待,立刻执行并重置计时起点 - 提供
.cancel()方法:清除待执行的 trailing 定时器(如有)
统一导出与 TypeScript 支持
在 utils/debounce-throttle.ts 中集中导出,类型定义清晰:
debounce<t extends function>(fn: T, delay: number, options?: { immediate?: boolean }): T & { cancel(): void }</t>throttle<t extends function>(fn: T, delay: number, options?: { leading?: boolean; trailing?: boolean }): T & { cancel(): void; flush(): void }</t>- 实际使用时,TS 能自动推导 fn 的参数与返回值类型,IDE 补全友好
实际调用示例
不用每次手写 setTimeout,一行引入、一行包装即可:
const handleResize = debounce(() => updateLayout(), 200); window.addEventListener('resize', handleResize);const handleScroll = throttle(fetchMore, 300, { trailing: true });- 组件卸载前调用
handleScroll.cancel(),防止内存泄漏或 setState 报错

















