Реализуйте функцию debounce(fn, ms), которая возвращает «debounced»-версию fn.
Debounced-функция откладывает вызов fn на ms миллисекунд после последнего вызова. Если за это время происходит ещё один вызов, таймер сбрасывается.
const log = debounce(console.log, 300);
log('a'); // таймер 300ms
log('b'); // сброс, таймер 300ms
// через 300ms: console.log('b')
После реализации могут спросить:
throttle?immediate — вызов в начале, а не в конце?Таймер хранится в замыкании — одна переменная timerId на все вызовы обёртки. Каждый новый вызов делает clearTimeout и ставит новый таймер.
Используйте fn.apply(this, args) вместо fn(...args) — это сохраняет контекст this, если debounce применяется к методу объекта.