Тема: Function Cache
Показать сообщение отдельно
  #39 (permalink)  
Старый 08.12.2014, 00:23
Аватар для bes
bes bes вне форума
Профессор
Отправить личное сообщение для bes Посмотреть профиль Найти все сообщения от bes
 
Регистрация: 22.03.2012
Сообщений: 3,744

Сообщение от krutoy
И не мучайся. В JS в общем случае, кэширование невозможно.
хорошо, но давай двинемся на шаг дальше

function f(obj) {
	return obj.a + obj.b;
}

function isSame(args1, args2) {
	var len1 = args1.length;
	var len2 = args2.length;
	if ( len1 != len2 ) return false;
	for (var i = 0; i < len1; i++) {
		if ( args1[i] === args2[i] ) continue;
		return false;
	}
	return true;
}

function cacheFn(fn) {
	var cache = [];
	return function () {
		var len = cache.length;
		for (var i = 0; i < len; i++) {
			if ( isSame(cache[i].args, arguments) && JSON.stringify(arguments) == cache[i].strArg) {
				console.log("cache: " + cache[i].res + "\n\n");
				return cache[i].res;
			}
		}
		cache.push( {args: arguments, strArg: JSON.stringify(arguments), res: fn.apply(this, arguments)} );
		console.log("call: " + cache[len].res + "\n\n")
		return cache[len].res;
	}
}

var cacheF = cacheFn(f);
var o1 = Object.create({b: 2})
var o2 = Object.create({b: 3})
o1.a = 1
o2.a = 1
//cacheF(o1);
//cacheF(o1);
cacheF(o2);
cacheF(o2);

console.log("----");
o2.a = 10
cacheF(o2);
cacheF(o2);

console.log("****");
o2.b = 10;
cacheF(o2);
cacheF(o2);


есть ещё примеры?

Последний раз редактировалось bes, 08.12.2014 в 00:26.
Ответить с цитированием