в чем разница между throttle и debounce в javascript и какие у них ограничения
Это две техники ограничения частоты выполнения функции в JavaScript, но они используются в разных сценариях и имеют свои особенности.
Throttle позволяет ограничить выполнение функции так, чтобы она выполнялась не чаще чем через заданный интервал времени. То есть, как только функция была вызвана, она не будет вызвана снова до окончания заданного периода времени.
Обычно он используется для обработки событий, которые возникают часто, таких как прокрутка (scroll), изменение размера окна (resize) или перемещение мыши (mousemove). Это помогает уменьшить нагрузку на систему, так как функция будет вызываться с фиксированным интервалом, вместо того чтобы вызываться каждый раз, когда происходит событие.
function throttle(func, limit) {
let lastFunc;
let lastRan;
return function() {
const context = this;
const args = arguments;
if (!lastRan) {
func.apply(context, args);
lastRan = Date.now();
} else {
clearTimeout(lastFunc);
lastFunc = setTimeout(function() {
if ((Date.now() - lastRan) >= limit) {
func.apply(context, args);
lastRan = Date.now();
}
}, limit - (Date.now() - lastRan));
}
};
}
// Использование
const throttledFunction = throttle(() => {
console.log('Triggered!');
}, 2000);
// Пример привязки к событию
window.addEventListener('scroll', throttledFunction);
Debounce обеспечивает задержку выполнения функции до тех пор, пока событие не прекратится. То есть, функция будет вызвана только после того, как прошло заданное время с момента последнего вызова.
Debounce часто используется в ситуациях, когда вы хотите, чтобы функция вызывалась только после завершения активных действий, например, при вводе текста в поле на форме или при завершении изменения размера окна. Это предотвращает выполнение функции на каждом нажатии клавиши или каждый раз, когда происходит событие.
function debounce(func, delay) {
let debounceTimer;
return function() {
const context = this;
const args = arguments;
clearTimeout(debounceTimer);
debounceTimer = setTimeout(() => func.apply(context, args), delay);
};
}
// Использование
const debouncedFunction = debounce(() => {
console.log('Triggered after typing!');
}, 300);
// Пример привязки к событию
const inputField = document.getElementById('input');
inputField.addEventListener('input', debouncedFunction);