krutoy, возьми мой пример и покажи, что не так
|
Цитата:
cache[stamp] = fn.apply(this, arguments); в ключ записывается не объект, а лишь текстовое представление его "верхушки", первого хеша. В дальнейшем, когда ты делаешь проверку, у тебя следующий "отпечаток", при сравнении строк даст true, хотя объекты, записанные туда, могут быть другими. o1={a: 1} o2={a: 1} textRepresent1=JSON.stringify(o1) textRepresent2=JSON.stringify(o2) console.log( o1===o2, textRepresent1===textRepresent2 ) // false true У тебя из кеша будет извлечено не то, что ты ожидаешь. |
Цитата:
Цитата:
бахать "сикретные свойства" примитивам для того , чтобы их "опознать" - это уже не мемоизация, а геморизация. ты взял этот способ из книги Фленегана?. (да, мы все его читали) |
Цитата:
Цитата:
Цитата:
|
Цитата:
и я не совсем понял, что ты имеешь в виду. Если ты расшитяешь именно примитив, то ты делаешь это так String.prototype.foo=1 и, в этом случае, у тебя все строки будут иметь св-во foo. Если же ты делаешь foo=new String("foo") foo.foo=1 alert(foo.foo) // 1 Ты расширяешь не примитив, а конкретный строковый объект. |
Цитата:
Цитата:
function f(obj) { return obj.a = 2; }; 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]; } } var cacheF = cacheFn(f); var o1 = {a: 1}; var o2 = {a: 1}; cacheF(o1); cacheF(o2); console.log("o1:"); console.log(o1); console.log("o2:"); console.log(o2); |
Цитата:
Цитата:
|
Цитата:
|
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 // |
Цитата:
|
Часовой пояс GMT +3, время: 08:51. |