如何在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
是一元的。我不能确定在创建缓存时,它是本地化到函数的,不应该对外部作用域可用,那么它是脚本的缓存吗?如果以后使用相同的参数调用,它如何缓存函数并在调用后调用?@Saqlainmemoize
返回一个闭包,因此它保留对外部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; }