利用闭包与高阶函数实现缓存函数的创建
缓存函数是一种用于存储和重复利用计算结果的机制。其基本思想是,当一个函数被调用并计算出结果时,将该结果存储在某种数据结构中 (通常是一个缓存对象)以备将来使用。当相同的输入参数再次传递给函数时,不再执行实际的计算,而是直接返回之前缓存的结果,从而避免重复的耗时计算。
避免重复计算、提高性能、数据结构存储
缓存一般是以键值对的形势存储在数据的结构当中,其中的键是函数的输入参数,而值就是对应的输出结果
示例:以下当前函数调用了几次,就执行了几次,且传入的参数一样,那么输出的结果都是同一个结果。
function expensiveCalculation(input){console.log("执行昂贵计算...")return input * 2;
}
expensiveCalculation(10)
expensiveCalculation(10)
expensiveCalculation(10)
expensiveCalculation(10)
expensiveCalculation(10)

什么闭包:
允许函数保留其包含(封闭)范围中变量的访问权,即使在该范围外执行函数
闭包是一种在函数嵌套的情况下,内部函数可以访问外部函数作用域中变量的现象。基本上,闭包就是将函数内部和函数外部连接起来的一座桥梁。闭包允许你从一个函数中返回另一个函数,并且在后者执行时仍然能够访问前者的变量。
通俗地说,闭包是由函数和与其相关的引用环境组合而成的实体。它可以让函数访问在它被创建时所处的词法作用域中的变量,即使函数在这个词法作用域外执行,也能够访问这些变量。
闭包的基本特点是:
- 内部函数可以访问外部函数中的变量和参数。
- 外部函数执行完毕后,其作用域链不会被销毁,因为内部函数持有对其的引用。
- 外部函数中的变量和参数在内部函数被引用时,会被保存在堆内存中,而不是在栈内存中,因此内部函数可以访问它们。
闭包常常用于解决 JavaScript 中的作用域问题、封装变量、模块化代码等方面,同时也会因为滥用而导致内存泄漏等问题。因此,在使用闭包的过程中需要谨慎操作。
什么高阶函数:
接受函数作为参数或将函数作为返回值输出的函数
高阶函数的特点:
-
接受函数作为参数:高阶函数可以接受一个或多个函数作为参数,这样可以灵活地传递不同的行为和逻辑给函数。
-
返回函数:高阶函数可以返回一个新的函数,这样可以延迟执行、构造闭包、创建函数工厂等。
那么根据闭包和高阶函数,我们可以使用以下代码去实现缓存函数
参数是一个函数,且函数将会返回一个闭包函数,且会保留originalFunction和cache两个内容变量的访问权,所以会产生一个闭包的概念,并且参数和返回值都是一个函数,所以它进行的是高阶函数的一个操作。以下我们判断的是arg参数是否存在于函数当中,如果存在,则直接利用缓存返回值进行结果的返回,如果不存在,则使用原始函数的调用进行的返回,将其结果值进行缓存的处理
//originalFunction是一个原始的函数
function createCachedFunction(originalFunction){//定义一个对象进行缓存数据的存储,cache用来计算先前的结果值const cache = {}return function(arg){//判断是否存在,存在则从缓存中获取if(cache[arg]){console.log(cache,arg)console.log('从缓存中取值',cache[arg])return cache[arg]}//如果是第一次执行,那么则将结果值放在resultconst result = originalFunction(arg)cache[arg] = resultconsole.log("执行昂贵计算...",result)return result}
}function expensiveCalculation(input){console.log("执行昂贵计算...")return input * 2;
}//调用createCachedFunction函数
const cachedExpensiveCalculation = createCachedFunction(expensiveCalculation)cachedExpensiveCalculation(10)
cachedExpensiveCalculation(10)
cachedExpensiveCalculation(10)
cachedExpensiveCalculation(10)
cachedExpensiveCalculation(10)
可以定义一个createCachedFunction函数,它接受一个原始函数作为参数,并返回一个闭包函数。闭包函数中使用一个缓存对象cache来存储计算结果。当闭包函数被调用时,首先检查参数是否存在于缓存中,如果存在,则直接返回缓存中的结果;如果不存在,则调用原始函数进行计算,并将结果存入缓存中后返回。这样,每次调用闭包函数时,都会先检查缓存,避免重复计算。
以下则是输出的结果:

上述代码通过调用 createCachedFunction 函数创建了一个带有缓存功能的函数cachedExpensiveCalculation。它接收一个输入参数,并在内部使用 originalFunction 进行昂贵的计算。首次调用时,会执行昂贵的计算并将结果存储在 cache 对象中,后续再次调用时会直接从缓存中获取结果
在示例中,我们调用了 cachedExpensiveCalculation(10) 多次,但只有第一次会执行昂贵的计算,后续调用都会从缓存中获取之前的结果。这样可以避免重复计算,提高程序的性能。
相关文章:
利用闭包与高阶函数实现缓存函数的创建
缓存函数是一种用于存储和重复利用计算结果的机制。其基本思想是,当一个函数被调用并计算出结果时,将该结果存储在某种数据结构中 (通常是一个缓存对象)以备将来使用。当相同的输入参数再次传递给函数时,不再执行实际的计算,而是直…...
P1042 [NOIP2003 普及组] 乒乓球 JAVA 题解
题目背景 国际乒联现在主席沙拉拉自从上任以来就立志于推行一系列改革,以推动乒乓球运动在全球的普及。其中11分制改革引起了很大的争议,有一部分球员因为无法适应新规则只能选择退役。华华就是其中一位,他退役之后走上了乒乓球研究工作&…...
最大公因数,最小公倍数详解
前言 对于初学编程的小伙伴们肯定经常遇见此类问题,而且为之头疼,今天我来给大家分享一下,最大公因数和最小公倍数的求法。让我们开始吧! 文章目录 1,最大公因数法1法2法3 2,最小公倍数3,尾声 …...
无脑利用API实现文心一言AI对话功能?(附代码)
前言:在当今数字化的时代,人工智能(AI)技术正在不断演进,为开发者提供了丰富的工具和资源。其中,API(应用程序接口)成为构建强大AI应用的关键组成部分之一。本文将介绍如何利用API来…...
加速数据采集:用OkHttp和Kotlin构建Amazon图片爬虫
引言 曾想过轻松获取亚马逊上的商品图片用于项目或研究吗?是否曾面对网络速度慢或被网站反爬虫机制拦截而无法完成数据采集任务?如果是,那么本文将为您介绍如何用OkHttp和Kotlin构建一个高效的Amazon图片爬虫解决方案。 背景介绍 亚马逊&a…...
lua安装
lua安装 1.Lua介绍 特点:轻量、小巧。C语言开发。开源。 设计的目的:嵌入到应用程序当中,提供灵活的扩展和定制化的功能。 luanginx,luaredis。 2.windows安装lua windows上安装lua: 检查机器上是否有lua C:\U…...
博士毕业需要发表几篇cssci论文
大家好,今天来聊聊博士毕业需要发表几篇cssci论文,希望能给大家提供一点参考。 以下是针对论文重复率高的情况,提供一些修改建议和技巧: 博士毕业需要发表几篇CSSCI论文 背景介绍 CSSCI即“中文社会科学引文索引”,被…...
UDP报文格式详解
✏️✏️✏️各位看官好,今天给大家分享的是 传输层的另外一个重点协议——UDP。 清风的CSDN博客 🛩️🛩️🛩️希望我的文章能对你有所帮助,有不足的地方还请各位看官多多指教,大家一起学习交流࿰…...
Python自动化测试如何自动生成测试用例?
汽车软件开发自动化测试攻略 随着软件开发在造车行业中占有越来越重要的地位,敏捷开发的思想在造车领域中也逐渐地被重视起来,随之而来的是整车厂对自动化测试需求越来越强烈。本文结合北汇在自动化测试方面的丰富经验,简单介绍一下实施自动…...
椋鸟C语言笔记#27:字符串数字提取(atoi、atol、atoll、atof)
萌新的学习笔记,写错了恳请斧正。 目录 atoi 模拟实现 atol与atoll(C99起) atof 合法的浮点值 返回值 使用示例 在stdlib.h中还有几个有意思的字符串函数 它们的功能是将字符串开头的数字提取出来 下面我们具体看一看这几个函数吧 …...
Git 命令使用总结
git init: 在当前目录创建一个新的空Git仓库。git clone [url]: 从远程仓库克隆一个项目到本地。git add [file]: 将文件添加到暂存区。git commit -m “message”: 提交暂存区的文件到本地仓库,并添加一条提交信息。git status: 查看当前工作区的状态(已…...
Linux常见面试题30题详细答案解析(二)
1. 如何使用Linux中的包管理器进行软件包依赖管理? Linux中的包管理器如apt、yum等可以自动处理软件包的依赖关系。当安装或升级软件包时,包管理器会自动解决软件包的依赖关系,确保所需的库和工具都已经安装。掌握如何使用包管理器进行依赖管…...
Linux查询指定时间点段日志Linux查询指定文件
Linux服务器高效查询日志查询文件 Ⅰ、常用几种日志查询语法Ⅱ、常用几种查询语法 Ⅰ、常用几种日志查询语法 #查询某日志前xx行日志 head -n 行数 日志文件名 #查询某日志后xx行日志 tail -n 行数 日志文件名 #查询固定时间点日志(前提是这个时间点确实有日志输出…...
2023年华为HCIA认证H12-811题库讲解
在VRP平台上,可以通过下面哪种方式返回到上一条历史命令?( ) A、Ctr1U B、Ctr1P C、左光标 D、上光标 试题答案:BD 试题解析:在VRP系统中,ctrlU为自定义快捷键,ct…...
MacOS上配置Jenkins开机自启动
之前文章有写过,如何在Windows环境下,通过vbsbat脚本的组合拳实现Jenkins的开机自启动,最近换了电脑,又要搭建Jenkins了,顺带整理分享下MacOS上配置Jenkins开机自启动的方法。 具体配置步骤: 打开终端应用…...
指针相关知识(入门)
通过前面的学习,我们已经对c语言有了一个初步的认识 接下来,我们继续学习。进入下一个阶段,指针。这个部分的知识较多,可能学习起来有些吃力,但是,从简到难,我们慢慢学习。 一.指针的概念 导入…...
我的NPI项目之Android 安全系列 -- Android Strongbox 初识
从Android9(Pie)开始,Google强烈建议支持Strongbox. 具体描述如下: 一直到目前的Android14. 对应的内容也一并贴出来: 说人话就是Android开始通过独立于主SoC的单元进行密钥存储了。 通常,这样的单元就是我们通常称作的Secure Element(SE)&am…...
3、Kafka 线上集群部署方案怎么做?
文章目录 1、操作系统的选择1.1、I/O 模型的使用1.2、数据网络传输效率1.3、社区支持度 2、磁盘的选择3、磁盘容量的规划3.1、举例思考本问题:3.2、计算一下:3.3、规划磁盘容量时你需要考虑下面这几个元素: 4、带宽规划4.1、计算 总结 1、操作…...
【Oracle】常用数据库sql记录
文章目录 1、获取指定日期所在年份2、获取指定日期所在月份3、获取指定日期去年同期日期4、获取指定日期所在年份的总天数5、获取年初到指定日期的天数6、除法运算7、递归查询8、REPLACE函数9、DECODE 函数10、聚合函数11、窗口函数11.1 ROW_NUMBER函数11.2 RANK函数11.3 LEAD …...
在线监控网址源码/ 网站监控工具源码/ 网站监控系统源码/定时任务/网站网址URL状态监控神器
源码介绍: 在线监控网址源码、 网站监控工具源码,它作为网站监控系统源码,有定时任务,支持卡密充值,是网站网址URL状态监控神器。让数据库监控更加简单和专业。远程云中监控、实时邮件告警、丰富的指标和图表、分析和…...
大湾区制造企业品牌突围:从“有品无牌”到价值孵化
当看到2023年凯度BrandZ全球品牌百强榜上苹果以8800亿美元蝉联榜首,14个中国品牌入围时,我们能清晰地感受到品牌价值对企业的重要性。然而,在粤港澳大湾区(广东),众多制造型中小企业面临着尴尬的局面&#…...
(2024实战指南)从零到一:CTFd平台部署、Docker动态靶场构建与动态Flag生成全解析
1. CTFd平台部署全流程解析 搭建CTF竞赛平台的第一步就是部署CTFd。作为目前最流行的开源CTF平台,CTFd支持动态靶机、题目管理、积分排名等核心功能。我去年为学校搭建竞赛平台时,发现最新版的CTFd在Docker部署上有些变化,这里分享下2024年最…...
.NET逆向工程新选择:dnSpyEx调试器与程序集编辑全解析
.NET逆向工程新选择:dnSpyEx调试器与程序集编辑全解析 【免费下载链接】dnSpy Unofficial revival of the well known .NET debugger and assembly editor, dnSpy 项目地址: https://gitcode.com/gh_mirrors/dns/dnSpy 你是否曾面对一个没有源代码的.NET程序…...
面向28nm ELK晶圆的WLCSP封装激光开槽质量与可靠性研究
2017 — Investigation of Production Quality and Reliability Risk of ELK Wafer WLCSP Package Research and Development, Taiwan Semiconductor Manufacturing Company, Ltd., Hsinchu Science Park, Hsinchu, Taiwan, R.O.C. 摘要 本文系统研究了28nm工艺ELK(极端低k)…...
Docker 部署 SpringBoot 项目超详细教程
Docker 部署 SpringBoot 项目超详细教程一篇适合新手的 Docker 部署 SpringBoot 实战教程,包含: Docker 安装镜像加速SpringBoot 打包Dockerfile 编写构建镜像容器部署日志查看防火墙开放常见问题解决 图文并茂,保姆级教学。本文假设你已拥有…...
集成三相桥驱动的MCU:AiP8F7201电机控制方案解析
1. 项目概述:为什么我们需要“集成三相桥式驱动的微控制器”?在电机控制领域,尤其是消费电子、家电、工业自动化这些我们每天都会接触到的场景里,工程师们一直在和一堆“麻烦”作斗争。想象一下,你要设计一个驱动无刷直…...
微软 Qlib 实战:从零构建跑赢大盘的 AI 智能选股策略(附最新回测与全流程代码)
在 GitHub 的量化投资社区中,微软亚洲研究院开源的 Qlib 毫无疑问是王者级别的存在(13k Stars)。传统的量化策略通常依赖主观经验设定的指标(如:均线突破、MACD背离),而 Qlib 则是让 人工智能&a…...
2026年山东大学软件学院创新项目实训博客(五)
2026年山东大学软件学院创新项目实训博客(五) 一、工作进展 本阶段 Agent 架构模块的核心推进是将父级编排从「单次补全加强制工具调用」升级为有界多轮循环,并同步完成系统提示词的多步能力声明、意图分类器的域关键词防误路由、以及 SSE 事…...
开源智能告警聚合路由引擎:从原理到实战部署
1. 项目概述:一个开源的智能告警聚合与路由引擎如果你和我一样,长期负责线上系统的稳定性,那你一定对“告警风暴”和“告警疲劳”这两个词深恶痛绝。想象一下这样的场景:凌晨三点,一个核心服务的某个实例因为网络抖动重…...
正交设计实战指南:从理论到最优方案验证
1. 正交设计入门:从概念到实战价值 第一次接触正交设计是在五年前的一个电机工艺优化项目上。当时面对12个关键参数、每个参数4-5个水平的选择困境,如果做全面实验需要3125组数据,而项目周期只允许做50组实验。正是正交设计让我们用36组实验…...
