思路
- 函数也是对象,可以把函数的执行结果缓存在函数的属性中
实现一
const toUpperCase = val => val.toUpperCase()
const cacheFn = fn => val => fn[val] ? fn[val] + ' ' : fn[val] = fn(val)
const fn = cacheFn(toUpperCase)
console.log(['q', 'w', 'q', 'w'].map(fn))
问题
- 可能会覆盖掉函数的原有属性,例如name,arguments等
- 把所有的缓存值,放在一个特定的属性中,例如fn.cache,避免覆盖原有的属性
实现二
const toUpperCase = val => val.toUpperCase()
const cacheFn = fn =>
fn.cache
?
val => fn.cache[val] ? fn.cache[val] + ' ' : fn.cache[val] = fn(val)
:
cacheFn(Object.assign(fn, { cache: {} }))
const fn = cacheFn(toUpperCase)
console.log(['q', 'w', 'q', 'w'].map(fn))