Debounce и Throttle в JavaScript: один сниппет — две техники
Когда ты ловишь события вроде scroll, resize, input, важно не перегружать браузер. Для этого существуют две техники:
debounce (отложить выполнение) и throttle (ограничить частоту вызовов).
function throttleDebounce(fn, delay, mode = 'throttle') {
let lastCall = 0;
let timeout;
return function (...args) {
const now = Date.now();
if (mode === 'debounce') {
clearTimeout(timeout);
timeout = setTimeout(() => fn.apply(this, args), delay);
} else {
if (now - lastCall >= delay) {
lastCall = now;
fn.apply(this, args);
}
}
};
}
// Использование:
// Debounce (например, поиск по инпуту)
input.addEventListener('input', throttleDebounce(handleInput, 300, 'debounce'));
// Throttle (например, scroll)
window.addEventListener('scroll', throttleDebounce(trackScroll, 200, 'throttle'));