前端高频事件处理优化
在前端开发中,频繁的事件触发是常见场景,比如窗口 resize、页面滚动 scroll、用户输入的 keyup 或 keydown 等。如果不加控制,这些事件会高频触发,导致性能瓶颈。因此,防抖(Debounce)和节流(Throttle)这两种技术就显得尤为重要。
防抖(Debounce)
核心原理
防抖是一种延迟执行的技术。当事件被触发时,系统会等待一段指定时间再执行处理函数。如果在等待期间事件再次被触发,计时器会被重置,重新开始计时。只有当事件在指定时间内没有再次触发,函数才会真正执行。
这种机制能有效避免某些高频率操作被反复调用,从而提升性能。
典型场景
- 搜索输入框:用户在输入时连续触发
keyup事件,只有在停止输入后才发送请求。 - 窗口调整:浏览器窗口大小变化频繁触发
resize,防抖确保调整结束后再执行布局计算。 - 表单验证:减少因频繁输入导致的重复验证请求。
代码实现
function debounce(func, wait) {
let timeout;
return function (...args) {
const context = this;
clearTimeout(timeout);
timeout = setTimeout(() => func.apply(context, args), wait);
};
}
这里的核心逻辑在于利用闭包保存定时器引用。每次触发事件时先清除上一次的定时器,然后重新设置一个新的。这样就能保证只有在间隔期内没有新事件发生时,原函数才会被执行。
实战示例
假设我们在一个搜索输入框中使用防抖来减少请求次数:
const searchInput = document.getElementById('search');
const handleSearch = debounce(function () {
console.log('Sending request for:', this.value);
}, 500);
searchInput.addEventListener(, handleSearch);


