从作为参数传递的函数中拉出参数

时间:2016-05-24 18:10:23

标签: javascript closures

我正在尝试实现下划线的memoize功能。

应该按如下方式调用Memoize:

subtract = function(a, b) {
  return a - b;
};

memoSub = _.memoize(subract);
memoSub(2, 1);
//1

记忆应该"记住"以前调用其保存的函数,而不是重新计算(重新运行函数),它应该返回那些保存的值。

我设置了以下结构,但我遇到的困难是了解如何访问传入函数的参数,以便我可以以某种方式保存它们,从而检查它们是否&# 39;与先前传入的参数相同。

下面基本上是_.once的一个实现,我不需要访问传入函数的参数。我尝试修改它以使其成为_.memoize

  _.memoize = function(func) {

    var called = false;
    //i'd rather this be var storedArgs = {};
    var result;

    return function() {
      //i'd rather be checking if these args have been seen before
      if (!called) {
        result = func.apply(this, arguments);
        called = true;
        //i'd rather save the computed results to the storedArg obj here
      }
      return result;
    };
  };

func.apply允许我调用一个函数并传入主arguments,即函数定义中func之后的所有内容,但是如何才能访问参数/参数func? (在这种情况下,参数为(a, b),如上所示。

编辑:我怀疑我真正需要做的是以某种方式访问​​不存在的参数:

return function(/*how can I "capture" what will go here?*/) {...}

2 个答案:

答案 0 :(得分:1)

你已经有了答案,内部函数中的参数对象正是你想要捕获的。

内部函数和外部函数都有一个参数变量,但是一旦你进入内部函数,外部变量就会被遮蔽而内部函数会被遮蔽。

答案 1 :(得分:1)

您已经可以通过arguments访问参数了。您需要的是参数到结果的映射。如果映射包含当前传递的参数的条目,则返回结果。如果没有,请计算并存储它。

示例:

var results = {};
return function() {
  var key = Array.prototype.join.call(arguments);
  if (!(key in results)) {
    return results[key] = func.apply(this, arguments);
  }
  return results[key];
};

注意:这会对参数进行非常简单的序列化,并且不适用于复杂的参数(对象)。