函数记忆化

函数记忆化

Posted by limantang on November 21, 2019

函数记忆化

函数记忆化就是当同一个函数第二次计算时, 就不在重新执行这个函数, 而是使用上一次执行过得到的结果

注意点:

  • 同一个函数是指函数名相同, 函数实参列表相同

大体思路: 每次函数执行就将结果缓存下来第二次执行的时候直接去缓存 使用对象缓存, 函数的参数作为key, 结果作为value

  • ES5版本
function memo(fn) {
  var cache = {};
  return function () {
    var argsStr = Array.prototype.join.call(arguments, ',');
    console.log(argsStr);
    if (!cache[argsStr]) {
      console.log('没缓存')
      cache[argsStr] = fn.apply(undefined, arguments);
    } else {
        console.log('缓存了')
    }
    return cache[argsStr];
  }
}
var objA = {
  a: 'a',
};
var objB = {
  a: 'a'
};

function objFn(obj) {
  return obj.a;
}

var addM = memo(add);
console.log(addM(1,2,3));
console.log(addM(1,2,3));

var objFnM = memo(objFn);
console.log(objFnM(objA));
console.log(objFnM(objB));
  • ES6
function memo(fn) {
  const cache = {};
  return function (...args) {
    const argsStr = args.join.call(arguments, ',');
    console.log(argsStr);
    if (!cache[argsStr]) {
      console.log('没缓存')
      cache[argsStr] = fn.apply(undefined, args);
    } else {
        console.log('缓存了')
    }
    return cache[argsStr];
  }
}

var objA = {
  a: 'a',
};
var objB = {
  a: 'b'
};

function objFn(obj) {
  return obj.a;
}

var addM = memo(add);
console.log(addM(1,2,3));
console.log(addM(1,2,3));

var objFnM = memo(objFn);
console.log(objFnM(objA));
console.log(objFnM(objB));

  • 最终版
function memo(fn) {
   const cache = {};
   return function (...args) {
     const argsStr = JSON.stringify(args);
     console.log(argsStr);
     if (!cache[argsStr]) {
       console.log('没缓存')
       cache[argsStr] = fn.apply(undefined, args);
     } else {
         console.log('缓存了')
     }
     return cache[argsStr];
   }
 }

function add(a, b, c) {
  return a + b + c;
}

var objA = {
  a: 'a',
};
var objB = {
  a: 'b'
};

function objFn(obj) {
  return obj.a;
}

var addM = memo(add);
console.log(addM(1,2,3));
console.log(addM(1,2,3));

var objFnM = memo(objFn);
console.log(objFnM(objA));
console.log(objFnM(objB));

源码地址

blog-source-code/src/functionMemo at master · echoheart/blog-source-code · GitHub