我正在尝试实现下划线的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?*/) {...}
答案 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];
};
注意:这会对参数进行非常简单的序列化,并且不适用于复杂的参数(对象)。