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

标签 javascript memoization

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

我首先定义一个函数:

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,然后它返回一个新函数。您根据函数调用的结果调用它(在本例中为数字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));

关于javascript - 我正在尝试用 javascript 重写 memoize (下划线),有人可以解释一下吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42523396/

相关文章:

javascript - 如何使用纯 Javascript(不使用 Jquery)使用类选择器检测元素外部的点击

algorithm - 递归股票最大化

haskell - 函数式编程语言中的自动内存

c++ - 如果将 Memoization 添加到 Recursion,则错误的解决方案

algorithm - 在 O(n) 时间内计算 2^n

php - 有没有办法通过 JavaScript 设置 php 变量

javascript - 如何将多个 javascript 类中的函数组合到一个对象中

javascript - 如何使用 javaScript 进行相移?

javascript - while 循环时浏览器卡住(贪吃蛇游戏)

python - 在 Python 中内存整个 block