function/memoize.jsjavascript
/**
* 创建带 Map 缓存的记忆化函数。
* @function memoize
* @memberof module:function
* @param {Function} fn 需要缓存的函数
* @param {Function} [resolver] 根据参数生成缓存键的函数
* @returns {Function} 记忆化函数,附带可读写的 cache 属性
* @throws {TypeError} fn 或 resolver 不是函数时抛出
*/
function memoize(fn, resolver = (...args) => args[0]) {
if (typeof fn !== 'function' || typeof resolver !== 'function') throw new TypeError('fn and resolver must be functions')
const cache = new Map()
const memoized = function (...args) {
const key = resolver.apply(this, args)
if (cache.has(key)) return cache.get(key)
const result = fn.apply(this, args)
cache.set(key, result)
return result
}
memoized.cache = cache
return memoized
}
export default memoize