Edit in JSFiddle

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

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

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

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