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

by Artem

JavaScript

'use strict';

function f(x) {
  return Math.random() * x; // random для удобства тестирования
}

function makeCaching(f) {
  var cache = {};

  function wrapper(num) {
    if (!(num in cache)) {
      cache[num] = f.call(this, num);
    }
    return cache[num];
  }

  return wrapper;
}

f = makeCaching(f);

var a, b, c;

a = f(1);
b = f(1);
c = f(1);
alert(a == b); // true (значение закешировано)
alert(a == c);

b = f(2);
alert(a == b); // false, другой аргумент => другое значение