实现一个缓存函数,缓存函数执行结果

194 阅读1分钟

思路

  1. 函数也是对象,可以把函数的执行结果缓存在函数的属性中

实现一

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))

/**执行结果
 * [ 'Q', 'W', 'Q ', 'W ' ]
 * 后两个是通过缓存取值
 */

问题

  1. 可能会覆盖掉函数的原有属性,例如name,arguments等
  2. 把所有的缓存值,放在一个特定的属性中,例如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))
/**执行结果
 * [ 'Q', 'W', 'Q ', 'W ' ]
 * 后两个是通过缓存取值
 */