Я правильно понимаю, что `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)`?
Если это так, то какова логика? Это странно. Может, я не знаю основного принципа?
Благодарю за помощь!
При выполнении кеширования функции `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++ ее адреса) и передача этой функции в виде аргумента. Чтобы вызвать функцию, даже если ее адрес в переменной, нужно написать скобки