如何在javascript中实现下划线memoize
作者:互联网
我正在开发自己的函数式编程库,现在引用下划线.
memoize _.memoize(function, [hashFunction])
Memoizes a given function by caching the computed result. Useful for speeding up slow-running computations. If passed an optional hashFunction, it will be used to compute the hash key for storing the result, based on the arguments to the original function. The default hashFunction just uses the first argument to the memoized function as the key.
var fibonacci = _.memoize(function(n) {
return n < 2 ? n: fibonacci(n - 1) + fibonacci(n - 2);
});
上面的代码可以实现自动记忆而不需要处理数组看起来很神奇,我看到了下面的源代码,但内部设计仍然不清楚.
// 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有一个缓存(memoize.cache = {}),用于存储函数调用的结果.当它被调用时,它通过两种方式确定存储结果的地址:调用hasher函数或key参数.
hasher函数的工作原理如下(来自下划线页面):
If passed an optional hashFunction, it will be used to compute the
hash key for storing the result, based on the arguments to the
original function. The default hashFunction just uses the first
argument to the memoized function as the key.
然后,它调用您传递的函数func.apply(…),并将结果存储在缓存[地址]中.
第二次调用memoized函数时,结果将已经在缓存中(!_.has(..)将返回false)并且不会重复计算.
我不明白为什么它返回缓存[key]而不是缓存[地址]很难…在我看来缓存[地址]将是正确的选择.
更新
正如评论中所指出的,您提供的代码不是memoize的最新实现.这是最新的实现(1.6.0):
_.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));
};
};
它的工作方式相同,只是它更优雅;如果没有提供hasher函数,它使用_.identity作为键,这是一个只返回作为参数传递的值的函数:
_.identity = function(value) { return value; }
除此之外,缓存现在称为备忘录,但工作方式相同.
标签:javascript,underscore-js,memoization 来源: https://codeday.me/bug/20190728/1562082.html