我正在尝试重写 javascript 中的 memoize(对于下划线),有人可以解释一下吗?

I'm trying to rewrite memoize in javascript (for underscore), can someone explain this?

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

我先定义一个函数:

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

这是我对记忆功能的尝试:

  _.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 首先在 函数 上调用,并且它 returns 是一个新函数。您在函数调用的 结果 上调用它(在本例中是数字 7)。

为了让它正常工作,您需要重新安排一些事情。

另请注意,尝试使用数组本身作为对象的索引是不明智的。解决这个问题的一种方法是将参数数组转换为 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));