防抖 debounce 和 节流 throttle 的区别?
目录
防抖(debounce)和节流(throttle)都是前端开发中用于优化频繁触发事件(如 scroll、resize、input、mousemove 等)的方法,但它们的应用场景和实现思路所有不同。
一句话总结:
- 防抖:最后一次触发后等待一段时间再执行(拖后执行)
- 节流:每隔一段时间执行一次(间隔执行)
定义和区别
| 特性 | 防抖(Debounce) | 节流(Throttle) |
|---|---|---|
| 定义 | 事件被触发后延迟一段时间执行,若期间再次触发则重新计时 | 一定时间间隔内只执行一次 |
| 触发频率 | 停止触发一段时间后才执行一次 | 每隔固定时间执行一次 |
| 常见场景 | 搜索框输入、按钮点击防止重复提交等 | 页面滚动监听、窗口 resize、拖拽等 |
| 实现原理 | setTimeout + 清除旧定时器 | setTimeout 或 时间戳比较 |
简单示例
1. 防抖(debounce)
function debounce(fn, delay) {
let timer;
return function (...args) {
clearTimeout(timer);
timer = setTimeout(() => fn.apply(this, args), delay);
};
}使用场景示例:
const onInput = debounce(() => {
console.log('发送搜索请求');
}, 500);
inputElement.addEventListener('input', onInput);2. 节流(throttle)
function throttle(fn, delay) {
let lastTime = 0;
return function (...args) {
const now = Date.now();
if (now - lastTime >= delay) {
lastTime = now;
fn.apply(this, args);
}
};
}使用场景示例:
const onScroll = throttle(() => {
console.log('处理滚动事件');
}, 200);
window.addEventListener('scroll', onScroll);