@aLeXxX_03

Как происходит кеширование, если вызывает функция 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) ); // возвращаем из кеша

alert( slow(2) ); // slow(2) кешируем
alert( "Again: " + slow(2) );


Правильно же я понимаю, что тут alert( slow(1) ); происходит вызов функции slow(x) с аргументом 1?

Если так, то почему они тут пишут alert( "Again: " + slow(1) ); - возвращаем из кеша.
Из какого кеша?
Если вызывалась функция slow(x), в которой нет никакого кеширующего функционала, а он есть в функции cachingDecorator, которая НИ РАЗУ не вызывалась.

И что такое slow = cachingDecorator(slow);?
Это тоже самое, что let slow = cachingDecorator(slow);?

Или при вызове slow(1) происходит НЕ вызов функции function slow(x), а как раз вызов slow = cachingDecorator(slow);?

Если да, то в чем логика? Что за бред? Или я чего-то не знаю базового?

Ведь очевидно же, что при slow(1) происходит вызов slow(x) с параметром 1.

СПАСИБО ЗА ПОМОЩЬ!
  • Вопрос задан
  • 2475 просмотров
Пригласить эксперта
Ответы на вопрос 2
Aetae
@Aetae Куратор тега JavaScript
Тлен
В js функция не является чем-то особенным и неприкасновенным.

function slow(x) { ... }
Утириовано: создана функция и положена в переменную slow, аналогично:
var slow;
slow = function (x) { ... };


slow = cachingDecorator(slow);
Пишем в переменную результат вызова cachingDecorator с аргументом из slow.

Всё происходит по порядку:
0. Создаётся функция и кладётся в пременую slow.
1. Берётся текушая функция из slow.
2. Кладётся в аргуметы cachingDecorator.
3. Результат cachingDecorator(slow) кладётся в переменную slow.

Есть всякие нюансы и оговорки, но в целом не следует переусложнять, со всеми сущностями в js можно работать одинаково.
Ответ написан
@rPman
slow = cachingDecorator(slow);после этого slow у тебя уже не прошлая функция а целый класс, в котром прописан вызов старой функции при условии отсутствии данных в кеше (объект в этом классе)

Заметь, slow без скобок это не вызов функции, а получение ее самой (в терминах c++ ее адреса) и передача этой функции в виде аргумента. Чтобы вызвать функцию, даже если ее адрес в переменной, нужно написать скобки
Ответ написан
Ваш ответ на вопрос

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

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