Answer
t.me/js_testОтвет:
function debounce(f, ms) {
let isCooldown = false;
return function () {
if (isCooldown) return;
f.apply(this, arguments);
isCooldown = true;
setTimeout(() => (isCooldown = false), ms);
};
}
Объяснение:
Создаём флаг isCooldown к которому мы сможем обращаться из внутренней функции с помощью замыкания. Далее возвращаем функцию в которой проверяем, если isCooldown равен true то ничего не делаем, если же isCooldown равен false то вызываем функцию которую нам передавали и создаём таймер который изменит флаг через ms миллисекунд.
Код для проверки:
function debounce(f, ms) {
let isCooldown = false;
return function () {
if (isCooldown) return;
f.apply(this, arguments);
isCooldown = true;
setTimeout(() => (isCooldown = false), ms);
};
}
let fn = debounce(console.log, 1000);
fn(1); // 1
fn(2); // nothing
setTimeout(() => fn(3), 100); // nothing
setTimeout(() => fn(4), 1100); // 4
setTimeout(() => fn(5), 1500); // nothing