const _ = require('lodash');
function getArea(a, b) {
console.log(a, b);
return a * b
};
const getAreaFn = _.memoize(getArea);
getAreaFn(4,2); // 4
getAreaFn(4,2); //
getAreaFn(5, 1); // 5
function memoize(fn) {
// 使用对象将结果缓存起来,键为传入函数fn的参数,值为传入函数fn的返回值
let cache = {};
// 返回一个function,在其中判断是否需要再次执行获取返回值
return function () {
const key = JSON.stringify(arguments);
// 对cache[key]进行赋值,有两种情况:
// 1.cache中存在key键,则直接取值对其赋值
// 2.cache中无key键,需要调用传入的fn函数
// 使用fn.apply调用fn函数,第一个参数指向fn本身,第二个参数为传入函数fn的参数,随后取其返回值
// cache[key] = cache[key] || fn.apply(fn, arguments);
// cache[key] = cache[key] || fn.call(fn, ...arguments);
cache[key] = cache[key] || fn.bind(fn, ...arguments)();
return cache[key];
}
}
const getAreaFn2 = memoize(getArea);
getAreaFn2(6, 5) // 6 5
getAreaFn2(6, 5) //getAreaFn2(7, 4) // 7 4