Тема: Function Cache
Показать сообщение отдельно
  #29 (permalink)  
Старый 07.12.2014, 18:18
Профессор
Посмотреть профиль Найти все сообщения от krutoy
 
Регистрация: 09.11.2014
Сообщений: 610

bes,
Нет, ты опять не понял. Задача твоей кэширующей ф-ции в том, чтобы "понять", была ли данная функция (которая в замыкании), уже вызвана с данными аргументами. Именно этого она не делает, точней делает, но только с примитивами. Она не может по этой "псевдосигнатуре" объекта определить, был ли данный объект уже в качестве аргумента, или нет, потому что разные объекты могут давать одинаковый отпечаток.

o1=Object.create({b: 2})
o2=Object.create({b: 3})

o1.a=1
o2.a=1

f=function(o){return o.a+o.b}

function cacheFn(fn) {
    var cache = {};
    return function () {
        var stamp = JSON.stringify(arguments);
        console.log(cache);
        if (!(stamp in cache)) {
            cache[stamp] = fn.apply(this, arguments);
            console.log("call: " + cache[stamp]);
        }
        console.log("cache: " + cache[stamp] + "\n\n");
        return cache[stamp];
     
    }
}

theCache=cacheFn(f)
alert(theCache(o1))
alert(theCache(o2))
//  {}
//  call: 3
//  cache: 3
//  
//  
//  3
//  { '{"0":{"a":1}}': 3 }
//  cache: 3
//  
//  
//  3
//

Последний раз редактировалось krutoy, 07.12.2014 в 18:31.
Ответить с цитированием