我知道 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
在函数上调用它,然后它返回一个新函数。您正在根据函数调用的结果(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));
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句