Edit in JSFiddle

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

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

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

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

//ce code fonction aussi avec les fonctions natives
Math.sqrt.cache(2);
Math.sqrt.cache(2); //retourne la valeur mise en cache