При обработке событий ввода пользователя (скролл, ввод в поле, ресайз окна) функции-обработчики могут вызываться сотни раз в секунду. Это создает огромную нагрузку на браузер. Для контроля частоты вызовов используются техники Debounce и Throttle.
Debounce (Отсрочка)
Debounce гарантирует, что функция будет выполнена только один раз после того, как прошло определенное время с момента последнего вызова. Это идеально подходит для поиска (autocomplete) или сохранения данных.
function debounce(func, delay) {
let timeoutId;
return function (...args) {
clearTimeout(timeoutId);
timeoutId = setTimeout(() => {
func.apply(this, args);
}, delay);
};
}
// Использование
const searchInput = document.querySelector('#search');
const handleSearch = debounce((e) => {
console.log('Запрос к API:', e.target.value);
}, 500);
searchInput.addEventListener('input', handleSearch);
Если пользователь печатает быстро, запрос не отправится, пока он не остановится на 500 мс. Это экономит ресурсы сервера и клиента.
Throttle (Ограничение частоты)
Throttle гарантирует, что функция будет вызываться не чаще одного раза в указанный интервал времени. Это полезно для событий scroll, resize или mousemove, где нам нужно реагировать постоянно, но не слишком часто.
function throttle(func, limit) {
let inThrottle;
return function (...args) {
if (!inThrottle) {
func.apply(this, args);
inThrottle = true;
setTimeout(() => inThrottle = false, limit);
}
};
}
// Использование
window.addEventListener('scroll', throttle(() => {
console.log('Позиция скролла:', window.scrollY);
}, 200));
Здесь функция выполнится сразу, а затем не чаще чем раз в 200 мс, независимо от того, сколько раз сработало событие скролла.
Выбор стратегии
- Используйте Debounce, когда важно действие после завершения активности (ввод текста, окончание ресайза).
- Используйте Throttle, когда важно действие во время активности, но с ограничением (анимация при скролле, отслеживание положения мыши).
В современных фреймворках (React, Vue) эти функции часто встроены в хуки или директивы, но понимание реализации помогает отлаживать проблемы производительности.