当前位置: 首页 > article >正文

JavaScript 柯里化:把“大餐”拆成“小炒”的艺术

JavaScript 柯里化把“大餐”拆成“小炒”的艺术在函数式编程中柯里化Currying是一个高频词汇。很多初学者看到类似add(1)(2)(3)这样的代码时会一头雾水为什么函数可以这样调用它到底有什么用别急今天我们就把这个看似复杂的概念嚼碎了喂给你。 目录 什么是柯里化 生活化比喻从“满汉全席”到“自助套餐” 代码对比普通函数 vs 柯里化函数️ 手写一个通用的柯里化工具函数 柯里化的三大实战场景 总结1. 什么是柯里化官方定义柯里化Currying是把接受多个参数的函数变换成接受一个单一参数最初函数的第一个参数的函数并且返回接受余下的参数且返回结果的新函数的技术。通俗解释原本你需要一次性给函数所有参数它才干活。柯里化之后你可以分批给参数。每给一个参数它就返回一个新函数等着接收下一个参数直到所有参数都给齐了它才最终执行并返回结果。核心特征参数分批传递fn(a, b, c)变成fn(a)(b)(c)。延迟执行参数没给够之前不执行具体逻辑只返回新函数。参数复用固定的参数可以先传进去生成一个“半成品”函数供后续使用。2. 生活化比喻从“满汉全席”到“自助套餐”想象你去餐厅吃饭❌普通函数你必须一次性点完所有菜主食、饮料、甜点厨房才开始做。如果你忘了点饮料就得重新下单或者等下次再来。cook(牛排, 可乐, 冰淇淋)✅柯里化函数你采用自助餐模式。你先拿了一个盘子放了牛排。返回一个新状态盘子里有牛排接着你又拿了可乐。返回一个新状态盘子里有牛排可乐最后你拿了冰淇淋。此时盘子满了厨房开始制作套餐端给你。cook(牛排)(可乐)(冰淇淋)好处是什么如果你每天都吃牛排你可以先预置一个“牛排盘”每天只需要决定加什么饮料和甜点即可。这就是“参数复用”3. 代码对比普通函数 vs 柯里化函数假设我们要实现一个简单的加法函数。❌ 普通函数functionadd(x,y,z){returnxyz;}// 必须一次性传入所有参数console.log(add(1,2,3));// 6✅ 柯里化函数functioncurriedAdd(x){returnfunction(y){returnfunction(z){returnxyz;};};}// 可以分批传入参数conststep1curriedAdd(1);// 返回一个函数等待接收 yconststep2step1(2);// 返回一个函数等待接收 zconstresultstep2(3);// 所有参数齐了执行计算返回 6// 或者链式调用console.log(curriedAdd(1)(2)(3));// 6看起来代码变多了是的手动写柯里化很麻烦。所以我们需要一个通用的工具函数来自动完成这个转换。4. ️ 手写一个通用的柯里化工具函数在实际开发中我们不会为每个函数都手动嵌套闭包。我们会编写一个高阶函数curry它能把任何普通函数转换成柯里化函数。 实现代码/** * 通用柯里化函数 * param {Function} fn - 需要被柯里化的原函数 * returns {Function} - 柯里化后的新函数 */functioncurry(fn){// 获取原函数期望的参数个数constarityfn.length;returnfunctionjudge(...args){// 如果当前收集的参数个数 原函数期望的参数个数if(args.lengtharity){// 执行原函数返回结果returnfn.apply(null,args);}else{// 否则返回一个新函数继续收集剩余参数returnfunction(...restArgs){// 递归调用 judge将已收集的参数和新参数合并returnjudge.apply(null,args.concat(restArgs));};}};} 测试一下// 1. 定义一个普通函数functionsum(a,b,c){returnabc;}// 2. 将其柯里化constcurriedSumcurry(sum);// 3. 各种调用方式均有效console.log(curriedSum(1,2,3));// 6 (一次性传完)console.log(curriedSum(1)(2,3));// 6 (分批传)console.log(curriedSum(1)(2)(3));// 6 (完全柯里化)// 4. 参数复用示例constadd10curriedSum(10);console.log(add10(20,30));// 60 (10 20 30)console.log(add10(1,2));// 13 (10 1 2)5. 柯里化的三大实战场景柯里化不仅仅是炫技它在实际开发中有巨大的价值。场景一参数复用固定配置这是柯里化最核心的用途。当你有一个函数其中某些参数是固定的只有少数参数变化时柯里化可以帮你创建一个“专用版本”的函数。例子正则验证// 普通写法每次都要传正则表达式functioncheck(reg,txt){returnreg.test(txt);}check(/\d/g,test);// falsecheck(/[a-z]/g,test);// true// 柯里化写法预先固定正则生成专用验证器constcurriedCheckcurry(check);consthasNumbercurriedCheck(/\d/g);consthasLettercurriedCheck(/[a-z]/g);// 后续使用极其简洁且语义清晰hasNumber(test123);// truehasLetter(123);// false场景二延迟执行在某些场景下我们希望函数先接收部分参数但不立即执行直到满足特定条件或收集完所有参数后再执行。例子日志打印functionlog(level,date,msg){console.log([${level}]${date}:${msg});}constcurriedLogcurry(log);// 预设级别和时间constinfoLogcurriedLog(INFO)(newDate().toLocaleDateString());// 在代码的不同地方只关心消息内容infoLog(用户登录成功);infoLog(数据加载完成);场景三兼容性处理与函数组合在函数式编程库如 Lodash、Ramda中柯里化是函数组合Compose的基础。只有当函数都是单参数或柯里化后表现为单参数流时才能像管道一样轻松串联。// 假设我们有 lodash 的 curry 和 flowimport{curry,flow}fromlodash;constaddcurry((a,b)ab);constmultiplycurry((a,b)a*b);// 组合函数先加 10再乘 2constadd10ThenMultiply2flow(add(10),multiply(2));console.log(add10ThenMultiply2(5));// (5 10) * 2 30 总结特性普通函数柯里化函数参数传递一次性传递所有参数分批传递一次一个或一组执行时机调用即执行参数凑齐后才执行延迟执行主要优势简单直观参数复用、延迟执行、易于组合适用场景大多数常规业务逻辑配置项固定、函数式编程、高阶组件封装 博主寄语柯里化本质上是一种**“降维打击”**的思维它将一个多参问题分解为多个单参问题的序列。不要为了柯里化而柯里化。当发现你在重复传递相同的参数时就是使用柯里化的最佳时机。记住口诀多参变单参闭包来帮忙。参数若不够返回新函数。参数若凑齐执行出结果。复用与延迟代码更优雅。希望这篇文档能帮你彻底掌握柯里化如果有疑问欢迎在评论区留言。喜欢这篇文章吗记得点赞、收藏、转发哦❤️

相关文章:

JavaScript 柯里化:把“大餐”拆成“小炒”的艺术

🍛 JavaScript 柯里化:把“大餐”拆成“小炒”的艺术 在函数式编程中,柯里化(Currying) 是一个高频词汇。 很多初学者看到类似 add(1)(2)(3) 这样的代码时会一头雾水:为什么函数可以这样调用?它…...

CSS 终极指南:5 种水平垂直居中的完美方案

🎯 CSS 终极指南:5 种水平垂直居中的完美方案 在前端开发中,居中布局无处不在:弹窗、头像、加载动画、卡片内容…… 很多新手只会用 margin: 0 auto(只能水平居中),一旦遇到垂直居中就束手无策…...

告别重复点击!MouseClick鼠标连点器:3分钟掌握自动化神器

告别重复点击!MouseClick鼠标连点器:3分钟掌握自动化神器 【免费下载链接】MouseClick 🖱️ MouseClick 🖱️ 是一款功能强大的鼠标连点器和管理工具,采用 QT Widget 开发 ,具备跨平台兼容性 。软件界面美观…...

3步永久保存微信聊天记录:WeChatMsg让你的数字记忆永不丢失终极指南

3步永久保存微信聊天记录:WeChatMsg让你的数字记忆永不丢失终极指南 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Tren…...

Windows前端开发福音:手把手教你用Git Bash+rsync搞定项目自动部署

Windows前端开发福音:手把手教你用Git Bashrsync搞定项目自动部署 每次提交代码后,你是否还在手动拖拽文件到服务器?当团队其他成员都在享受Linux环境下的一键部署时,Windows开发者是否只能望洋兴叹?今天,…...

远程办公不求人:手把手教你用山石防火墙的Secure Connect打通内网访问(附客户端下载与配置避坑)

远程办公安全通道:山石防火墙Secure Connect全流程配置指南 居家办公已成为现代职场常态,但如何安全访问公司内网资源却让不少IT管理者头疼。传统VPN方案常因配置复杂、兼容性差等问题影响使用体验,而山石网科防火墙的Secure Connect功能提供…...

开源大模型如何直接控制机械臂?OpenClaw-Hermes-Direct项目深度解析

1. 项目概述:当开源大模型遇上“机械爪”指令最近在开源社区里,一个名为enzowyf/openclaw-hermes-direct的项目引起了我的注意。乍一看这个标题,它像是一个技术栈的拼接体:“openclaw”让人联想到开源机械臂或抓取系统&#xff0c…...

YimMenu终极指南:GTA5最强防护与功能增强工具完全解析

YimMenu终极指南:GTA5最强防护与功能增强工具完全解析 【免费下载链接】YimMenu YimMenu, a GTA V menu protecting against a wide ranges of the public crashes and improving the overall experience. 项目地址: https://gitcode.com/GitHub_Trending/yi/YimM…...

2026届最火的五大降AI率网站横评

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 若要降低被检测出是AIGC也就是人工智能生成内容的概率,那就得从文本特征方面着手…...

Windows 11下用VS2022编译libuvc库,搞定USB摄像头调试(附libusb、pthread依赖配置全流程)

Windows 11下用VS2022编译libuvc库的完整实践指南 USB摄像头开发在Windows平台向来是个技术活,特别是当你需要直接与硬件层打交道时。最近我在一个工业视觉项目中遇到了这样的需求:需要在Windows 11系统上通过libuvc库直接控制USB摄像头获取原始视频流。…...

如何配置PotPlayer字幕实时翻译插件实现双语观影体验

如何配置PotPlayer字幕实时翻译插件实现双语观影体验 【免费下载链接】PotPlayer_Subtitle_Translate_Baidu PotPlayer 字幕在线翻译插件 - 百度平台 项目地址: https://gitcode.com/gh_mirrors/po/PotPlayer_Subtitle_Translate_Baidu PotPlayer字幕实时翻译插件是一款…...

SAP MM ERS自动清账实战:手把手教你配置采购信息记录和供应商主数据(避坑日期问题)

SAP MM ERS自动清账实战:从配置到避坑的完整指南 在SAP MM模块中,ERS(Evaluated Receipt Settlement)功能一直是提升采购到付款流程效率的关键利器。想象一下,当物料入库后,系统能自动完成发票匹配和应付账…...

手把手图解:用Python从零实现Lloyd-Max量化器,并可视化它与均匀量化的效果差异

手把手图解:用Python从零实现Lloyd-Max量化器,并可视化它与均匀量化的效果差异 在数字信号处理领域,量化是将连续信号转换为离散值的关键步骤。想象一下,当你用手机录制一段音频时,麦克风捕捉到的声波是连续的模拟信号…...

终极微信好友检测指南:3步找出谁删除了你并自动标记

终极微信好友检测指南:3步找出谁删除了你并自动标记 【免费下载链接】WechatRealFriends 微信好友关系一键检测,基于微信ipad协议,看看有没有朋友偷偷删掉或者拉黑你 项目地址: https://gitcode.com/gh_mirrors/we/WechatRealFriends …...

避开这3个坑,轻松下载NREL Wind Toolkit风速数据(新手避雷指南)

避开这3个坑,轻松下载NREL Wind Toolkit风速数据(新手避雷指南) 第一次接触NREL的风速数据下载,很多人会直接搜索教程按部就班操作,结果往往卡在某个环节无法继续。本文将聚焦三个最常见却最容易被忽视的"雷区&qu…...

从QoS到虚拟化:拆解PCIe TLP头里的TC、TH和AT字段,如何影响系统性能?

从QoS到虚拟化:拆解PCIe TLP头里的TC、TH和AT字段,如何影响系统性能? 在构建高性能计算、存储或网络设备时,PCIe总线的高级特性往往成为系统优化的关键杠杆。不同于基础的数据传输功能,TC(Traffic Class&am…...

如何快速诊断和优化AMD系统存储性能:SMUDebugTool的实用指南

如何快速诊断和优化AMD系统存储性能:SMUDebugTool的实用指南 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: http…...

DeepSeek V4 应用实战:构建智能数据分析Agent

系列导读:本篇将分享如何利用DeepSeek V4 API构建智能数据分析Agent,实现自动化数据处理、图表生成、洞察分析等功能。 文章目录一、项目概述1.1 功能设计1.2 技术架构二、环境配置2.1 依赖安装2.2 数据加载模块2.3 数据分析模块三、可视化生成模块3.1 图…...

如何为iPad mini 2降级iOS 10.3.3:终极性能恢复完整指南

如何为iPad mini 2降级iOS 10.3.3:终极性能恢复完整指南 【免费下载链接】Legacy-iOS-Kit An all-in-one tool to restore/downgrade, save SHSH blobs, jailbreak legacy iOS devices, and more 项目地址: https://gitcode.com/gh_mirrors/le/Legacy-iOS-Kit …...

蓝桥杯单片机省赛拿分秘籍:第十一届这道‘电压阈值计数’题,我是这么啃下来的

蓝桥杯单片机省赛实战:电压阈值计数题的破局思维 第一次看到"电压阈值计数"这个题目时,我的大脑几乎是一片空白。那是在第十一届蓝桥杯省赛的现场,周围键盘敲击声此起彼伏,而我的屏幕上的代码却迟迟无法实现题目要求的计…...

如何永久保存微信聊天记录?WeChatMsg数据导出工具完整指南

如何永久保存微信聊天记录?WeChatMsg数据导出工具完整指南 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/W…...

终极指南:3步解锁Windows远程桌面完整功能

终极指南:3步解锁Windows远程桌面完整功能 【免费下载链接】SuperRDP Super RDPWrap 项目地址: https://gitcode.com/gh_mirrors/su/SuperRDP 还在为Windows远程桌面的限制而烦恼吗?家庭版无法使用,专业版只能单用户连接,这…...

终极指南:5分钟掌握Windows风扇控制神器FanControl的完整使用技巧

终极指南:5分钟掌握Windows风扇控制神器FanControl的完整使用技巧 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_…...

LeetCode 92.反转链表Ⅱ

1.思路:找到要反转区间的前一个位置preLeftNode和它的下一个节点LeftNode,然后对待反转区间的元素进行反转,然后重新连接链表。preLeftNode去连反转链表的新头节点,反转区间的最后一个节点LeftNode去连反转区间后的第一个节点。2.…...

3分钟解锁RPG游戏资源:RPG Maker MV/MZ解密器完整指南

3分钟解锁RPG游戏资源:RPG Maker MV/MZ解密器完整指南 【免费下载链接】RPG-Maker-MV-Decrypter You can decrypt RPG-Maker-MV Resource Files with this project ~ If you dont wanna download it, you can use the Script on my HP: 项目地址: https://gitcode…...

舞蹈动作生成评估:生物力学约束与时序分析

1. 项目背景与核心挑战在计算机视觉和动作生成领域,评估生成模型输出质量一直是个棘手问题。传统评估指标如FID(Frechet Inception Distance)或PSNR(峰值信噪比)主要针对静态图像,难以捕捉人类动作特有的时…...

解决PHP编译报错‘Package libzip not found’:手把手教你从源码编译libzip 1.9.2

解决PHP编译报错‘Package libzip not found’:从源码构建libzip 1.9.2全指南 当你在Linux环境下编译PHP并启用zip扩展时,可能会遇到一个令人头疼的错误提示:"Package requirements (libzip > 0.11 libzip ! 1.3.1 libzip ! 1.7.0) w…...

MATLAB科研图像导出终极指南:用export_fig解决论文配图难题

MATLAB科研图像导出终极指南:用export_fig解决论文配图难题 【免费下载链接】export_fig A MATLAB toolbox for exporting publication quality figures 项目地址: https://gitcode.com/gh_mirrors/ex/export_fig 你是否曾经在准备科研论文时,因为…...

不止是关灯:H3C NX30 Pro+OpenWrt的LED玩法,还能当状态指示灯用

H3C NX30 ProOpenWrt的LED高阶玩法:从状态监控到智能交互 深夜调试网络时,路由器面板上那枚忽明忽暗的LED灯突然开始规律性闪烁——这不是设备故障,而是你精心设计的网络健康可视化系统正在工作。对于OpenWrt玩家而言,H3C NX30 P…...

如何永久保存微信聊天记录?WeChatMsg为你打造个人专属的数字记忆库

如何永久保存微信聊天记录?WeChatMsg为你打造个人专属的数字记忆库 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trend…...