Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在javascript中实现下划线备忘录_Javascript_Underscore.js_Memoization - Fatal编程技术网

如何在javascript中实现下划线备忘录

如何在javascript中实现下划线备忘录,javascript,underscore.js,memoization,Javascript,Underscore.js,Memoization,我正在开发自己的函数式编程库,现在引用下划线 通过缓存计算结果来记忆给定函数。用于加速运行缓慢的计算。如果传递了一个可选的hashFunction,它将根据原始函数的参数计算用于存储结果的hash键。默认的hashFunction只使用memorized函数的第一个参数作为键 有人能告诉我发生了什么事吗 感谢。memoize有一个缓存(memoize.cache={}),用于存储函数调用的结果。调用它时,它通过两种方式确定存储结果的地址:调用哈希器函数或键参数 哈希函数的工作原理如下(从下划线

我正在开发自己的函数式编程库,现在引用
下划线

通过缓存计算结果来记忆给定函数。用于加速运行缓慢的计算。如果传递了一个可选的hashFunction,它将根据原始函数的参数计算用于存储结果的hash键。默认的hashFunction只使用memorized函数的第一个参数作为键

有人能告诉我发生了什么事吗


感谢。

memoize
有一个
缓存(
memoize.cache={}
),用于存储函数调用的结果。调用它时,它通过两种方式确定存储结果的
地址
:调用
哈希器
函数或
参数

哈希函数的工作原理如下(从下划线页面):

如果传递了一个可选的hashFunction,它将用于计算 用于存储结果的哈希键,基于 原始功能。默认的hashFunction只使用第一个 参数作为键指向已记忆的函数

然后,它调用您传递的函数
func.apply(…)
,并将结果存储在
cache[address]

第二次调用memorized函数时,结果将已经在缓存中(
!\uhas(..)
将返回
false
),并且计算不会重复

我不明白为什么它会返回
cache[key]
而不是
cache[address]
tough…在我看来,
cache[address]
将是正确的选择

更新 正如评论中指出的,您提供的代码不是
memoize
的最新实现。这是最新的实现(1.6.0):

它的工作原理是一样的,只是它稍微优雅一点;如果未提供
散列程序
函数,则它将使用
..identity
作为键,该函数仅返回作为参数传递的值:

_.identity = function(value) { return value; }

除此之外,
cache
现在被称为
memo
,但工作方式相同。

谢谢链接。这个解决方案是相同的吗?是的,这个想法非常相似。这个问题的解决方案还包括检查传递给
memoize
(它确保它是一个函数)的参数类型,以及计算缓存地址的不同方法(它需要
callable.toString().hashCode()
)。使用
。identity
一点也不优雅<代码>.\u1.identity
是一元的。我不能确定在创建缓存时,它是本地化到函数的,不应该对外部作用域可用,那么它是脚本的缓存吗?如果以后使用相同的参数调用,它如何缓存函数并在调用后调用?@Saqlain
memoize
返回一个闭包,因此它保留对外部
memo
的引用,每一次调用都是一样的。您不了解或正在努力解决的部分是什么?为什么不查看最新版本的下划线?这不是
的当前实现。
 // Memoize an expensive function by storing its results.
  _.memoize = function(func, hasher) {
    var memoize = function(key) {
      var cache = memoize.cache;
      var address = hasher ? hasher.apply(this, arguments) : key;
      if (!_.has(cache, address)) cache[address] = func.apply(this, arguments);
      return cache[key];
    };
    memoize.cache = {};
    return memoize;
  };
_.memoize = function(func, hasher) {
    var memo = {};
    hasher || (hasher = _.identity);
    return function() {
      var key = hasher.apply(this, arguments);
      return _.has(memo, key) ? memo[key] : (memo[key] = func.apply(this, arguments));
    };
  }; 
_.identity = function(value) { return value; }