首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在JavaScript中实现自动记忆(返回封闭函数)

在JavaScript中实现自动记忆(返回封闭函数)
EN

Stack Overflow用户
提问于 2014-06-30 11:13:56
回答 1查看 1.4K关注 0票数 0

我读过

http://www.sitepoint.com/implementing-memoization-in-javascript/

自动回溯

在前面的所有例子中,函数都被显式地修改以添加回忆录。实现回忆录基础结构也是可能的,而根本不修改这些功能。这很有用,因为它允许将函数逻辑与回忆录逻辑分开实现。这是通过创建一个实用函数来完成的,该函数以一个函数作为输入,并将回忆录应用于它。下面的memoize()函数接受一个函数“func”作为输入。memoize()返回一个新函数,它将缓存机制封装在“func”周围。请注意,此函数不处理对象参数。为了处理对象,需要一个循环来单独检查每个参数并根据需要进行调整。

代码语言:javascript
复制
function memoize(func) {
  var memo = {};
  var slice = Array.prototype.slice;

  return function() {
    var args = slice.call(arguments);

    if (args in memo)
      return memo[args];
    else
      return (memo[args] = func.apply(this, args));

  }
}

用这个,我做了

代码语言:javascript
复制
var fib = function(n)
{
  if (n <= 1)
  {
    return 1; // as the Fib definition in Math
  }
  else
  {
    return fib(n - 2) + fib(n - 1); // as the Fib definition in Math
  }
};

log(memoize(fib)(43));
log(fib(43));

不过,我证实没有任何效果。

我也为了同样的目的尝试了一个npm图书馆,

https://github.com/medikoo/memoize

代码语言:javascript
复制
var memoize = require('memoizee');

log(memoize(fib)(43));
log(fib(43));

结果一样。

我错过了什么,以及如何修复和使它发挥作用?

谢谢!

编辑

代码语言:javascript
复制
require('memoizee');

var fib = function(n)
{
  if (n <= 1)
  {
    return 1; // as the Fib definition in Math
  }
  else
  {
    return fib(n - 2) + fib(n - 1); // as the Fib definition in Math
  }
};

var generator = function(f)
{
  return memoize(f);
};

var _fib = generator(fib);
console.log(_fib(40)); //no effect
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-30 11:29:33

memoize调用不改变fib函数,而是返回其新的回忆录对应函数。在您的代码中,只调用一次,下一次调用原始的fib函数。您需要创建一个回忆录“包装器”,并多次调用它:

代码语言:javascript
复制
var mFib = memoize(fib);
log(mFib(43));
log(mFib(43));

您还可以覆盖原始的fib = memoize(fib);,这将具有递归调用(这是有趣的调用)也将被回传的额外好处。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24488862

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档