@webov_web

Как работает эта строчка в декораторе?

Здравствуйте!
Изучаю JavaScript. Второй день не могу понять, как именно работает эта строчка в коде.

slow = cachingDecorator(slow);

Почему, когда присваиваем "slow" в качестве аргумента, сама функция "slow" продолжает работать в первоначальном варианте? То есть, почему она не переназначается? Это как-то связано с замыканием? Подскажите, пожалуйста, как называется такой приём и что загуглить на эту тему.

function slow(x) {
  // здесь могут быть ресурсоёмкие вычисления
  alert(`Called with ${x}`);
  return x;
}

function cachingDecorator(func) {
  let cache = new Map();

  return function(x) {
    if (cache.has(x)) {    // если кеш содержит такой x,
      return cache.get(x); // читаем из него результат
    }

    let result = func(x); // иначе, вызываем функцию

    cache.set(x, result); // и кешируем (запоминаем) результат
    return result;
  };
}

slow = cachingDecorator(slow);

alert( slow(1) ); // slow(1) кешируем
alert( "Again: " + slow(1) ); // возвращаем из кеша
  • Вопрос задан
  • 125 просмотров
Решения вопроса 2
Kozack
@Kozack Куратор тега JavaScript
Thinking about a11y
Начнем с того, что slow переназначается. Изначально функция что-то делает. а после, до неё добавляется кэширование.
То есть после slow = cachingDecorator(slow); в slow Находится уже другая функция.

функция "slow" продолжает работать в первоначальном варианте?

Потому, что после перезаписи, в slow находится функция, в которой есть доступ к переменной func (в ней хранится оригинальный функционал). И новый slow проверяет кэш и если там пусто запускает func

Извините, если пояснил не внятно :)
Ответ написан
Комментировать
@merss
да, это связано с замыканием, в момент создания анонимной функции, эта анонимная функция запоминает внешние переменные, в данном случае функцию slow, которая хранится в func, где-бы не вызывалась эта анонимная функция, она вызывает первоначальную функцию slow. Почитай у Кантора.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
mmmaaak
@mmmaaak
Почему, когда присваиваем "slow" в качестве аргумента, сама функция "slow" продолжает работать в первоначальном варианте?

поэтому:
let result = func(x); // иначе, вызываем функцию
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы