前端面试题-Javascript中如何实现函数缓存?函数缓存有哪些应用场景?(2024.2.19)

一、概念

函数缓存就像是一个记事本,它记住了函数每次计算的结果。当函数再次遇到相同的输入时,它不再重新计算,而是直接从记事本中查找并返回之前的计算结果。

这个记事本就是一个简单的存储空间,通过记录每次函数调用的输入和输出,来避免不必要的计算,提高效率。这在处理一些计算量较大、但结果常常相同的函数时很有用,就像查字典一样,遇到相同的词汇就直接翻到上次查过的页面,不再重新查找。

二、如何实现

实现函数缓存的一种简单方式是使用闭包和一个对象来存储计算结果

javascript 复制代码
function memoize(func) {
  const cache = {}; // 用于存储计算结果的缓存对象

  return function (...args) {
    const key = JSON.stringify(args); // 将函数参数转换成字符串作为缓存的键

    if (cache.hasOwnProperty(key)) {
      // 如果缓存中有结果,则直接返回缓存的结果
      console.log('Fetching from cache');
      return cache[key];
    } else {
      // 如果缓存中没有结果,则计算结果并存入缓存
      console.log('Calculating result');
      const result = func.apply(this, args);
      cache[key] = result;
      return result;
    }
  };
}

// 示例使用
const add = (a, b) => {
  console.log('Adding');
  return a + b;
};

const memoizedAdd = memoize(add);

console.log(memoizedAdd(1, 2)); // Calculating result, Adding, 3
console.log(memoizedAdd(1, 2)); // Fetching from cache, 3
console.log(memoizedAdd(3, 4)); // Calculating result, Adding, 7
console.log(memoizedAdd(3, 4)); // Fetching from cache, 7

三、有哪些应用场景

  1. 递归函数优化: 当递归函数中存在相同的参数组合时,通过函数缓存可以避免重复计算,提高递归函数的效率。

  2. 计算密集型操作: 对于一些需要较长时间计算的函数,可以使用函数缓存来避免重复计算,特别是当函数的输出在相同输入下始终相同的情况。

  3. API调用缓存: 在使用远程API或服务端数据时,函数缓存可以用于缓存请求的结果,减少对远程服务器的请求次数,提高响应速度。

  4. 页面性能优化: 在一些需要频繁计算的页面中,比如数据的排序、过滤等操作,可以使用函数缓存来避免重复计算,提高页面性能。

  5. 复杂数据转换: 当需要对复杂的数据进行计算或转换时,函数缓存可以避免对相同的数据进行重复的复杂计算。

  6. 计算结果稳定性要求高: 当函数的计算结果在相同的输入下始终相同,并且计算成本较高时,可以使用函数缓存来提高效率。

总的来说,函数缓存适用于那些在相同输入下有稳定输出,并且计算成本相对较高的场景。在这些场景中,使用函数缓存可以有效地提高性能和降低计算开销。

相关推荐
data analyse 4563 小时前
前端白屏问题按路由和资源加载顺序定位
大数据·前端·人工智能·数据分析·html
mldong3 小时前
推荐一款支持AI的数据可视化一站式报表平台
前端·人工智能
风骏时光牛马4 小时前
AI开源工具一站式体验:上手探索原生AI能力
前端
鬼手点金12 小时前
nanoGPT/nanochat 能做出 DeepSeek/Qwen 这样的大模型吗?
服务器·前端·javascript·bug·openclaw
软件技术NINI12 小时前
美妆商城html+Css+js 4页
javascript·css·html
蛋蛋的就会顺顺的12 小时前
hot100 p0——栈,贪心算法,动态规划
java·前端·javascript·算法·leetcode·力扣
程序员Sunday12 小时前
TypeScript 的 any、unknown、never 有什么区别?
前端·面试·typescript
朱涛的自习室12 小时前
70 美金的 Beyond Compare,我让 Gemini 4 和 DeepSeek 造个开源免费版(Day 2)
android·前端·人工智能
码艺-Alimjan13 小时前
Tauri 源码备份 · 打包 & 解压 总结,源码收集之路
前端·javascript·vue.js
小马不起床13 小时前
零基础玩转 FastAPI_11:前端后台管理页面
前端·状态模式·fastapi