我试图用javascript重写memoize(对于下划线),有人可以解释一下吗?

时间:2017-03-01 04:46:10

标签: javascript memoization

我知道memoize的目的是缓存值,这样就可以通过不必每次都重新计算相同的答案来更快地运行代码。我的问题源于返回一个函数(我认为)。谷歌chrome调试器对我来说不是很有用,因为每次我尝试运行这个memoize函数时,它只是从argus变量(我相信第4行)一直到分号。此外,结果总是返回一个空对象,而不是在结果中存储值。

我首先定义一个函数:



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




这是我对memoize功能的尝试:



  _.memoize = function(func) {

    var result = {};
    var flag = 0;
    var argus = Array.prototype.slice.call(arguments)
    return function() {
        
        if(result[key] === arguments){
            flag = 1
        }
        else if(flag = 0){
          result[argus] = func.apply(this, argus);
        }
        
      return result[argus];
    };
  };




我通过_.memoize(add(2,5))来调用memoize,但结果并没有存储在结果对象中。

我是否接近让这个memoize功能正常工作?你们可以给予任何指导,我们将不胜感激。

1 个答案:

答案 0 :(得分:2)

您遗漏的最重要的一点是,首先在函数上调用_.memoize,然后返回一个新函数。您在函数调用的结果上调用它(在这种情况下,这是数字7)。

为了让它发挥作用,你需要重新安排一些事情。

另请注意,尝试将数组本身用作对象的索引并不明智。解决这个问题的一种方法是将arguments数组转换为JSON并将其用作results对象的索引:



function add(a, b) {
  console.log('Called add(' + a + ', ' + b + ')');

  return a + b;
}

var _ = {};

_.memoize = function(func) {
  var results = {};
  return function() {
    var args = Array.prototype.slice.call(arguments);
    var key = JSON.stringify(args);

    if (!(key in results)) {
      results[key] = func.apply(this, args);
    }

    return results[key];
  };
};

var madd = _.memoize(add);

console.log(madd(2, 4));
console.log(madd(9, 7));
console.log(madd(2, 4));