手写memoize

78 阅读1分钟
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