什么是函数缓存?
函数缓存就是将函数运算过的结果缓存起来,当下次调用时,如果遇到相同的参数,就直接返回缓存中的数据。这种做法是典型的使用内存换取性能的手段,常用于缓存数据计算结果和缓存对象。
underscore1.11.0 中实现方式:
function memoize(func, hasher) {
var memoize = function(key) {
var cache = memoize.cache;
var address = '' + (hasher ? hasher.apply(this, arguments) : key);
if (!has(cache, address)) cache[address] = func.apply(this, arguments);
return cache[address];
}
memoize.cache = {};
return memoize;
}
代码中,underscore默认使用function的第一个参数作为key,直接使用的话是有问题的:
var add = function (a, b, c) {
return a + b + c
}
var memoizeAdd = memoize(add);
memoizeAdd(1, 2, 3); // 6
memoizeAdd(1, 2, 4); // 6
所以如果需要支持多参数,我们就需要传入hasher函数,自定义存储的key值,例如我们可以使用JSON.stringify:
var memoizeAdd = memoize(add, function () {
var args = Array.prototype.slice.call(arguments);
return JSON.stringify(args);
});
memoizeAdd(1, 2, 3); // 6
memoizeAdd(1, 2, 4); // 7
vue源码中函数缓存方法:
function cached (fn) {
var cache = Object.create(null);
return (function cachedFn (str) {
var hit = cache[str];
return hit || (cache[str] = fn(str))
}
}