防抖是通过重置定时器实现“最后一次触发后延迟执行”的技术,适用于搜索输入、resize等需响应终态的场景;其核心是清除旧定时器并新建,支持立即执行选项与this绑定。
防抖(Debounce)是一种限制函数执行频率的技术:当某个事件被高频触发时,它会忽略前面的多次调用,只在最后一次触发后等待一段“静默时间”,若期间不再触发,才真正执行函数。
它不是“减少调用次数”,而是“重新计时”。每次事件触发,就清除之前的定时器,新建一个。只有连续触发停止后,倒计时走完,函数才运行一次。
下面是一个带立即执行选项、支持 this 和参数透传的简洁实现:
function debounce(func, wait, immediate = false) {
let timeout;
return function(...args) {
const later = () => {
timeout = null;
if (!immediate) func.apply(this, args);
};
const callNow = immediate && !timeout;
clearTimeout(timeout);
timeout = setTimeout(later, wait);
if (callNow) func.apply(this, args);
};
}
const
debouncedHandler = debounce(handler, 300) 封装后再绑定事件,避免每次触发都新建函数未加防抖时,用户每按一个键就发请求,既浪费资源又可能打乱响应顺序;加了防抖后,只在用户暂停输入时查一次:
const searchInput = document.getElementById('search');
const search = (query) => fetch(`/api/search?q=${query}`); // 真实请求逻辑
// 防抖封装
const debouncedSearch = debounce((q) => {
if (q.trim()) search(q);
}, 400);
searchInput.addEventListener('input', (e) => {
debouncedSearch(e.target.value);
});
hello
fetch 中配合 AbortController 使用防抖关注“最后一次”,节流关注“固定节奏”。例如滚动监听: