Что происходит при выполнении кеширования функции slow?

Я правильно понимаю, что `alert(slow(1))` вызывает функцию `slow(x)` с аргументом 1?

Если это так, то почему `alert("Again: " + slow(1))` возвращает значение из кеша? 
Откуда берется этот кеш?
Я думал, что функция `slow(x)` не имеет функционала кеширования, а такой функционал есть только в `cachingDecorator`, которая еще не вызывалась.

И что означает `slow = cachingDecorator(slow)`?
Это то же самое, что и `let slow = cachingDecorator(slow)`?

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

Если это так, то какова логика? Это странно. Может, я не знаю основного принципа?

Благодарю за помощь!
  • 6 декабря 2023 г. 17:29
Ответы на вопрос 3
При выполнении кеширования функции `slow` происходит следующее:

1. При первом вызове функции `slow` с определенным аргументом, значение сохраняется в кеше.
2. При последующих вызовах функции `slow` с тем же аргументом, значение возвращается из кеша без выполнения самой функции.

Да, `alert(slow(1))` вызывает функцию `slow` с аргументом 1.

Выражение `slow = cachingDecorator(slow)` означает, что функция `slow` заменяется на новую функцию, возвращаемую `cachingDecorator`. Таким образом, при вызове `slow(1)` будет вызвана функция-обертка `cachingDecorator`, а не исходная функция `slow`.

При вызове `alert("Again: " + slow(1))` происходит повторный вызов функции `slow` с тем же аргументом 1. Кеш уже содержит значение для этого аргумента, поэтому значение берется из кеша без вызова `slow(x)`.

В коде предоставлен пример декоратора `cachingDecorator`, который добавляет функционал кеширования к любой функции.
В 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 можно работать одинаково.
slow = cachingDecorator(slow);после этого slow у тебя уже не прошлая функция а целый класс, в котром прописан вызов старой функции при условии отсутствии данных в кеше (объект в этом классе)Заметь, slow без скобок это не вызов функции, а получение ее самой (в терминах c++ ее адреса) и передача этой функции в виде аргумента. Чтобы вызвать функцию, даже если ее адрес в переменной, нужно написать скобки
Похожие вопросы