memoized函数
memoized函数实现原理:使用一组参数初次调用函数时,缓存参数和计算结果,当再次使用相同的参数调用该函数时,直接返回相应的缓存结果。
memoized函数:
点击查看代码
function memoize(func, hasher) {  
  if (typeof func !== 'function') {  
    throw new TypeError('Expected a function');  
  }  
  const memoized = function(...args) {  
    // 使用剩余参数(...args)来获取所有参数  
    const address = hasher ? hasher.apply(this, args) : args[0]; // 假设hasher接收所有参数,或者只使用第一个参数作为key  
    const cache = memoized.cache;  
  
    if (cache.has(address)) {  
        console.log('直接读缓存')
      return cache.get(address);  
    }  
    console.log('没有缓存')
    const result = func.apply(this, args);  
    // 缓存结果,注意这里不需要重新赋值memoized.cache,因为它已经是一个Map的引用  
    cache.set(address, result);  
    return result;  
  };  
  // 初始化缓存  
  memoized.cache = new Map();  
  return memoized;  
}  
示例:
不带有hasher函数的示例
点击查看代码
// 使用示例  
function factorial(n) {  
  return n <= 1 ? 1 : n * factorial(n - 1);  
}  
  
const memoizedFactorial = memoize(factorial);  
  
console.log(memoizedFactorial(5)); // 第一次调用,计算阶乘并缓存结果  
console.log(memoizedFactorial(5)); // 第二次调用,直接从缓存中获取结果  
带有hasher函数的示例
点击查看代码
// 带有hasher函数的示例  
function customHasher(a, b) {  
  return a + b; // 假设我们基于两个参数的和来缓存结果  
}  
  
function sum(a, b) {  
  return a + b;  
}  
  
const memoizedSum = memoize(sum, customHasher);  
  
console.log(memoizedSum(1, 2)); // 第一次调用,计算并缓存结果  
console.log(memoizedSum(2, 1)); // 由于hasher函数返回相同的key,所以直接从缓存中获取结果
本文来自博客园,🐱🚀作者:FAIGEL,打字创作不易,如转载请注明原文链接:https://www.cnblogs.com/FAIGEL/articles/18218604。谢谢✨

 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号