问题描述
我今天刚开始学习记忆,但我很难理解它。我正在尝试创建一个 memoize 函数,该函数存储已调用的参数函数的结果并返回其值而不是再次调用它 这是我的代码:
_.memoize = function(func) {
var stored = {};
if (stored.hasOwnProperty('calculated')) {
return stored['calculated'];
}
stored['calculated'] = func;
return func;
};
测试用例是:
var spy = sinon.spy(function() { return 'Dummy output'; });
var memoSpy = _.memoize(spy);
memoSpy(10);
expect(spy).to.have.been.calledOnce;
memoSpy(10);
expect(spy).to.have.been.calledOnce;
还有:
var spy = sinon.spy(function() { return 'Dummy output'; });
var memoSpy = _.memoize(spy);
memoSpy([1,2,3]);
expect(spy).to.have.been.calledOnce;
memoSpy([1,3]);
expect(spy).to.have.been.calledOnce;
我以为我的存储对象存储的是 func 的结果?
我得到的错误基本上是说'spy'应该被调用一次,但它被调用了两次。
解决方法
问题是,您返回的是原始函数。你必须做一些二阶的东西,比如
var memoize = function(func) {
var stored = {};
return (function() {
if (!stored.hasOwnProperty('calculated')) {
stored['calculated'] = func();
}
return stored['calculated'];
});
};
// To test
var x = function() { console.log('function called'); return 42; }
y = memoize(x)
y()
// => function called
// 42
y()
// 42
基本上返回一个经过修改/扩展的函数,该函数封装了原始 func
并添加了记忆行为。