Dekorator

//Dekorator: funkcja modyfikująca inną funkcję
//Przykład: cache, by działała szybciej
function cached(arr, fn) {
  var tab = arr;
  //funkcja zwraca funkcję, a nie wynik
  return function(x) {
    //funkcja w funkcji zwraca wynik - albo z cache albo wyliczony
    if(!!tab[x]) {
      return tab[x];
    } else {
      tab[x] = fn(x);
      return tab[x];
}}}

//z to teraz funkcja, mnożąca przez 100, ale wykorzystująca cache        
var z = cached([10, 20, 30], function(x){ return x * 100; });