khipster
@khipster

Почему работает эта функция тормозилка (вызов не чаще чем в N миллисекунд)?

Разве при повторном вызове f() не должны образовываться новые замыкания которым до предыдущих замыканий нет никакого дела?
function debounce(f, ms) {
  var state = null;
  var COOLDOWN = 1;
  return function() {
    if (state) return;
    f.apply(this, arguments);
    state = COOLDOWN;
    setTimeout(function() { state = null }, ms);
  }
}

function f(x) { alert(x) }
var f = debounce(f, 1000);
f(1); // 1, выполнится сразу же
f(2); // игнор
setTimeout( function() { f(3) }, 100); // игнор (прошло только 100 мс)
setTimeout( function() { f(4) }, 1100); // 4, выполнится
setTimeout( function() { f(5) }, 1500); // игнор

https://jsfiddle.net/gqj0gjoa/
  • Вопрос задан
  • 381 просмотр
Пригласить эксперта
Ответы на вопрос 1
khipster
@khipster Автор вопроса
Начало доходить, вызов то один: var f = debounce(f, 1000); Значит в одном замыкании работаем.
Ну да, f() это уже вызов возвращаемой функции, который хоть и образует новые замыкания, но значение переменной state всё равно берётся из единственного замыкания образованного при вызове функции debounce. А COOLDOWNможно просто заменить на 1.

// Кому надо моя версия без обёртки.
// Использую свойство функции, т.к. функция это объект.
// Свойство создается после! первого запуска.
function f(x) {
  if(f.rest) {
  	return;
  }
	console.log(x);
	f.rest = true;
  setTimeout(function() {
  	f.rest = false;
  }, 100);
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы