Edit in JSFiddle

//définition du cache
var cache = function(f){
    var cache = {}
    return function(){
        var key = Array.prototype.join.call(arguments, ',');
        console.debug(key, cache);
        if(key in cache){
            return cache[key];
        }else{
            return cache[key] = f.apply(this, arguments);           
        }
    }
}

//définition d'une fonction test
function square(x){
    document.write('square('+x+') est appelé');
    return x*x;
}

//définition de la fonction avec cache
var cachedSquare = cache(square);

//appel de la fonction sans cache
square(1); //affiche square(1) est appelé
square(1); //affiche square(1) est appelé => la fonction n'est pas mise en cache

//appel de la fonction avec cache
cachedSquare(2); //affiche square(2) est appelé
cachedSquare(2); //n'affiche rien => la fonction est bien mise en cache.
cachedSquare(3); //affiche square(3) est appelé

document.write(cachedSquare(2)); //affiche 4 => c'est bien la bonne valeur qui est retournée.

//seconde fonction avec cache
var cachedSquare2 = cache(square);
cachedSquare2(2); //affiche square(2) est appelé => la mémoire n'est pas partagée entre les fonctions mises en cache, alors qu'il s'agit de la même fonction d'origine.