Гы, приведенное решение не совсем хорошее, вот:
function f(arg) {
return arg.toUpperCase(); // может быть любой функцией
}
function makeCaching(f) {
var cache = {};
return function(x) {
if (!(x in cache)) {
cache[x] = f.call(this, x);
}
return cache[x];
};
}
f = makeCaching(f);
alert( f("aaaa") ); // OK
alert( f("toString") ); // Что-то не то :-(
А вот если изменить проверку условия
if (!(x in cache)) {
if (!(cache.hasOwnProperty(x))) {
тогда все OK