JavaScript中如何实现函数缓存,函数缓存有哪些应用场景

函数缓存就是将函数运算的结果进行缓存。

本质上是利用空间换时间。

常用于缓存数据计算结果和缓存对象。缓存只是一个临时的数据存储,它保存数据,为了方便将来对该数据的请求时,可以更快的得到处理。

缓存函数

实现一个缓存函数,主要依靠闭包、柯里化和高阶函数。

闭包:

javascript 复制代码
(function () {
  var a = 1;
  function add() {
    const b = 2
    let sum = b + a
    console.log(sum); // 3
  }
  add()
})()

柯里化:

把接受多个参数的函数转化为接受一个参数的函数。

javascript 复制代码
// 非柯里化函数
var add = function (x, y) {
  return x + y;
}
add(3, 4) //7
// 柯里化函数
var add2 = function (x) {
  //** 返回函数 **
  return function (y) {
    return x + y;
  }
}
add2(3)(4) //7

也就是把一个二元函数拆分为两个一元函数

高阶函数,通过接收其他函数作为参数或者返回其他函数的函数。

缓存函数代码:

javascript 复制代码
const memoize = function (func, content) {
  let cache = Object.create(null)
  content = content || this
  return (...key) => {
    if (!cache[key]) {
      cache[key] = func.apply(content, key)
    }
    return cache[key]
  }
}
  1. 在当前函数作用域内定义一个空对象,用来缓存运行的结果
  2. 使用柯里化返回一个函数,返回的函数由于闭包的特性,可以访问缓存
  3. 然后判断输入参数是不是存在缓存中,如果存在,就直接返回缓存中的数据,如果缓存中不存在,使用函数对输入输入的参数进行运算,然后把结果存储到缓存中。

应用场景

使用缓存的效率是非常高的,但并不是所有的场景中都适用,在这几个场景中,适合使用缓存:

  • 对于昂贵的函数调用,执行复杂计算的函数
  • 对于具有有限并且高度重复输入范围的函数
  • 对于具有重复输入值的递归函数'
  • 对于纯函数,也就是传入任何参数,都返回相同的结果,这时候就适用缓存。
相关推荐
烬头882125 分钟前
React Native鸿蒙跨平台实现二维码联系人APP(QRCodeContactApp)
javascript·react native·react.js·ecmascript·harmonyos
pas13628 分钟前
40-mini-vue 实现三种联合类型
前端·javascript·vue.js
2601_9498333941 分钟前
flutter_for_openharmony口腔护理app实战+预约管理实现
android·javascript·flutter
军军君012 小时前
Three.js基础功能学习十三:太阳系实例上
前端·javascript·vue.js·学习·3d·前端框架·three
xiaoqi9223 小时前
React Native鸿蒙跨平台如何实现分类页面组件通过searchQuery状态变量管理搜索输入,实现了分类的实时过滤功能
javascript·react native·react.js·ecmascript·harmonyos
qq_177767373 小时前
React Native鸿蒙跨平台实现应用介绍页,实现了应用信息卡片展示、特色功能网格布局、权限/联系信息陈列、评分展示、模态框详情交互等通用场景
javascript·react native·react.js·ecmascript·交互·harmonyos
2603_949462103 小时前
Flutter for OpenHarmony社团管理App实战:预算管理实现
android·javascript·flutter
wuhen_n3 小时前
JavaScript内存管理与执行上下文
前端·javascript
Hi_kenyon4 小时前
理解vue中的ref
前端·javascript·vue.js
jin1233224 小时前
基于React Native鸿蒙跨平台地址管理是许多电商、外卖、物流等应用的重要功能模块,实现了地址的添加、编辑、删除和设置默认等功能
javascript·react native·react.js·ecmascript·harmonyos