微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

创建 _.memoize 函数,将函数作为参数

如何解决创建 _.memoize 函数,将函数作为参数

我今天刚开始学习记忆,但我很难理解它。我正在尝试创建一个 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 并添加了记忆行为。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。