Мастер-классы по Javascript Екатеринбург Ростов-на-Дону Москва Узнать больше...
Содержание (скрыть) Содержание (показать)

Кеширующий декоратор

Создайте декоратор 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
Наверх

Реклама

Нашли опечатку?

Нашли опечатку на сайте? Что-то кажется странным?
Выделите соответствующий текст и нажмите Ctrl+Enter!

Последние Комментарии

Помоги другим!

Помоги другим узнать о хорошей статье!