默认的lodash memoize函数是否存在内存泄漏的危险?

ctr*_*usb 12 javascript lodash

我想使用,memoize但我担心缓存会无限增长,直到发生悲伤.

我无法通过google/stackoverflow搜索找到任何内容.

PS我正在使用lodash v4.

zer*_*kms 9

简短的回答是否定的.

当您使用某项memoize功能时,您接受以下合同:

  1. 该函数只能使用给定的参数调用一次
  2. 只要有必要保证#1(永远),缓存就会保留在那里

因此,只有永久保存数据的实现才能符合要求.

经常被混淆的是 - 内存泄漏"只是"低效"使用内存.

在这种情况下 - 如果它对您来说是一个问题,那么当您的算法有用时,您有责任重新创建一个memoized函数.因为只有你知道什么时候这样做是安全的,而且不能自动完成.


cha*_*rdy 8

除非您指定不同的缓存类型,否则Lodash会保留所有已记忆的数据.


默认缓存是lodash的MapCache:https:
//github.com/lodash/lodash/blob/4.14.0/lodash.js#L1968

memoized值存储在不同的数据结构中,具体取决于密钥是否适合散列(以及ES6 Map是否在环境中可用):
https ://github.com/lodash/lodash/blob/4.14.0/ lodash.js#L1987 https://github.com/lodash/lodash/blob/4.14.0/lodash.js#L5561

如果你看一下所有这些数据结构的"set"方法,你会发现LRU等没有任何规定:
Hash #set:https://github.com/lodash/lodash/blob/4.14. 0/lodash.js#L1832 ListCache
#set:https://github.com/lodash/lodash/blob/4.14.0/lodash.js#L1940
Map#set:https://developer.mozilla.org/en-美国/文档/网络/的JavaScript /参考/ Global_Objects /地图/套