2019年05月05日
今天看了下vue的源码,看到了一段缓存函数cached,并对其分析探究。
function cached(fn) {
// 创建一个空对象cache使用key,value对函数结果进行储存
var cache = Object.create(null);
return function cachedFn(str) {
var hit = cache[str];
// 如果有此函数fn(str)的储存则直接返回结果,没有则缓存到cache对象里
return hit || (cache[str] = fn(str));
};
}
上面vue的这段代码只能存储的函数参数为1个的情况,如果参数大于1个则无效~
// 只有一个参数a可行
var toUpperCase = cached(function(a) {
return a.toUpperCase();
});
// 有两个参数a,b不行
var sum = cached(function(a,b) {
return a+b;
});
function cached2(fn) {
var cache = Object.create(null);
return function() {
var args = Array.prototype.slice.call(arguments);
if (args.length < 1) {
throw new Error("no arguments");
} else {
//通过拼接参数形成一个独一无二的键值对key
var str = args.join("-");
// 当有缓存的时候直接取缓存的,没缓存则只需执行fn函数进行处理并缓存
return cache[str] || (cache[str] = fn.apply(fn, arguments));
}
};
}
var sum = cached2(function(a, b) {
return a + b;
});
var toUpperCase2 = cached2(function(a) {
return a.toUpperCase();
});
console.log("sum-----");
console.log(sum(1, 2)); //3
console.log(sum(1, 9)); //10
console.log(sum(1, 2)); //3
console.log(toUpperCase2("aa")); //AA
console.log(toUpperCase2("bb")); //BB
console.log(toUpperCase2("aa")); //AA
通过闭包,使用key,value键值对形式储存函数的执行结果,避免函数的重复运算。