Создайте декоратор makeCaching(f), который берет функцию f(arg) и возвращает обертку, которая кеширует её результаты.
То есть, при первом вызове обертки с определенным аргументом она вызывает f и запоминает значение.
При втором и последующих вызовах с тем же аргументом возвращается запомненное значение.
Для простоты - пусть функция f имеет только один аргумент, и он является числом.
Должно работать так:
function f(arg) {
return Math.random()*arg; // любая функция одного аргумента
}
function makeCaching(f) { /* ваш код */ }
f = makeCaching(f);
var a = f(1);
var b = f(1);
alert( a == b ); // true (значение закешировано)
b = f(2);
alert( a == b ); // false, другой аргумент => другое значение
Решение
Решение
Запоминать результаты вызова функции будем в замыкании, в объекте cache: { ключ:значение }.
function f(arg) {
return Math.random()*arg;
}
*!*
function makeCaching(f) {
var cache = {};
function wrapper(arg) {
if (!(arg in cache)) {
cache[arg] = f.call(this, arg);
}
return cache[arg];
}
return wrapper;
}
*/!*
f = makeCaching(f);
var a = f(1);
var b = f(1);
alert( a == b ); // true (значение закешировано)
b = f(2);
alert( a == b ); // false, другой аргумент => другое значение
#238