js函数柯里化
柯里化是把接受多个参数的函数变换成接受一个单一参数最初函数的第一个参数的函数并且返回接受余下的参数而且返回结果的新技术。用数学表达式来理解可能更直观假设有一个函数f它接受三个参数f(x, y, z) result柯里化之后它变成了这样一系列的嵌套函数f(x)f(y)f(z)result也就是fn(x, y, z)变成fn(x)(y)(z)核心思想通过闭包缓存参数直到集齐所有参数才执行最终逻辑。简单代码示例function add(x, y,z) { return x y z; } console.log(add(1, 2, 3)); // 输出: 6柯里化写法function curriedAdd(x) { return function(y) { return function(z) { return x y z }; } } // 或者使用 ES6 箭头函数简化 const curriedAddArrow x y zx y z; console.log(curriedAdd(1)(2)(3)); // 输出: 6发生了什么curriedAdd(1)执行后返回了一个记住了x1的新函数。紧接着调用这个新函数并传入2返回了一个记住了 y2的新函数。紧接着调用这个新函数并传入 3返回了一个记住了 z3的新函数。内部函数访问闭包中的x和传入的y还有z计算1 2 3。通用柯里化函数的实现 (核心技能)function curry(fn) { // limit 是 fn 声明时定义的参数个数 (arity) const limit fn.length; return function curried(...args) { // 1. 如果当前收集的参数 args 数量 limit说明参数够了执行原函数 if (args.length limit) { return fn.apply(this, args); //this是window,最后的结果是window.fn } else { // 2. 如果参数不够返回一个新函数来继续接收剩余参数 (...moreArgs) return function(...moreArgs) { // 将之前的 args 和新的 moreArgs 合并递归调用 curried return curried.apply(this, args.concat(moreArgs)); } } }; }测试这个工具// 一个接受4个参数的普通函数 function sum(a, b, c, d) { return a b c d; } // 将其柯里化 const curriedSum curry(sum); // 方式 1: 一次性传完 (依然支持) console.log(curriedSum(1, 2, 3, 4)); // 10 // 方式 2: 分步传参 (标准柯里化) console.log(curriedSum(1)(2)(3)(4)); // 10 // 方式 3: 混合传参 (非常灵活) console.log(curriedSum(1, 2)(3)(4)); // 10使用方向与实战场景 (Use Cases)你可能会问“直接传参不好吗为什么要搞这么麻烦” 柯里化的主要优势在于参数复用、延迟执行和代码组合。场景一参数复用创建偏函数假设我们需要验证很多个字符串是否符合某种正则表达式例如验证是否是邮箱或是否是数字。不使用柯里化function check(reg, txt) { return reg.test(txt); } // 每次都要传正则 check(/\d/g, test); // false check(/[a-z]/g, test); // true check(/\d/g, 123); // true使用柯里化我们可以固定住“正则”这个参数生成具体的检测函数。const curriedCheck curry(check); // 使用上面定义的 curry 工具 // 创建专门验证数字的函数 (复用了 /\d/g 参数) const hasNumber curriedCheck(/\d/g); // 创建专门验证字母的函数 const hasLetter curriedCheck(/[a-z]/g); // 现在使用起来非常语义化且不用重复写正则 console.log(hasNumber(test)); // false console.log(hasNumber(123)); // true console.log(hasLetter(test)); // true与map等高阶函数配合在处理数组时柯里化能让代码极其简洁。假设我们要获取数组中所有对象的id属性。const persons [{ id: 1, name: A }, { id: 2, name: B }]; // 普通写法 const ids1 persons.map(p p.id); // 柯里化写法 const getProp curry((key, obj) obj[key]); const getId getProp(id); // 预设我们要取 id // 代码极具可读性map (获取id) const ids2 persons.map(getId); console.log(ids2); // [1, 2]. 总结 (Summary)优点复用性通过固定部分参数生成功能更具体的小函数如hasNumber,getId。可读性代码语义更加清晰接近自然语言。延迟执行直到所有参数凑齐前函数都不会真正运行可以分阶段积累数据。函数式编程基石柯里化让函数变成了“单参数”函数这使得函数组合Composition变得容易得多类似流水线f(g(x))。

相关新闻

react-markdown使用

react-markdown使用

装包 yarn add react-markdown rehype-raw remark-gfm remark-math rehype-mathjax import ReactMarkdown, { Components } from react-markdown import rehypeRaw from rehype-raw import remarkGfm from remark-gfm import remarkMath from remark-math import rehypeMathjax…

2026/7/5 6:02:06 阅读更多 →
为什么0基础转行网络安全,web安全是首选?

为什么0基础转行网络安全,web安全是首选?

随着 5G、工业互联网、人工智能等新兴领域技术的兴起,从而快速推动了各国从人人互联迈向万物互联的时代。 奇安信董事长齐向东曾说过:“如果说5G带来了物联网和人工智能的风口,那么网络安全行业就是风口的平方——风口的风口。" 因此&a…

2026/7/5 1:25:15 阅读更多 →
Nodejs计算机毕设之基于nodejs的宠物医院就诊信息管理系统的设计与实现(完整前后端代码+说明文档+LW,调试定制等)

Nodejs计算机毕设之基于nodejs的宠物医院就诊信息管理系统的设计与实现(完整前后端代码+说明文档+LW,调试定制等)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/3 8:18:38 阅读更多 →

最新新闻

ExtFUSE社区贡献指南:如何参与这个开源文件系统革命

ExtFUSE社区贡献指南:如何参与这个开源文件系统革命

ExtFUSE社区贡献指南:如何参与这个开源文件系统革命 【免费下载链接】extfuse Extension Framework for FUSE 项目地址: https://gitcode.com/openeuler/extfuse 前往项目官网免费下载:https://ar.openeuler.org/ar/ ExtFUSE(Extensi…

2026/7/5 8:00:16 阅读更多 →
如何让英雄联盟游戏体验提升3倍?探索LeagueAkari的智能辅助革命

如何让英雄联盟游戏体验提升3倍?探索LeagueAkari的智能辅助革命

如何让英雄联盟游戏体验提升3倍?探索LeagueAkari的智能辅助革命 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 你是否曾因错过对局…

2026/7/5 8:00:16 阅读更多 →
OpenEuler SONIC内核补丁与标准Linux内核的7个主要差异:网络性能优化终极指南

OpenEuler SONIC内核补丁与标准Linux内核的7个主要差异:网络性能优化终极指南

OpenEuler SONIC内核补丁与标准Linux内核的7个主要差异:网络性能优化终极指南 【免费下载链接】sonic-linux-kernel The OpenEuler kernel patches used with SONIC 项目地址: https://gitcode.com/openeuler/sonic-linux-kernel 前往项目官网免费下载&#…

2026/7/5 8:00:16 阅读更多 →
如何轻松获取高质量音乐:六音音源修复版完整使用指南

如何轻松获取高质量音乐:六音音源修复版完整使用指南

如何轻松获取高质量音乐:六音音源修复版完整使用指南 【免费下载链接】New_lxmusic_source 六音音源修复版 项目地址: https://gitcode.com/gh_mirrors/ne/New_lxmusic_source 想要免费享受高品质音乐吗?六音音源修复版为你提供了完美的解决方案&…

2026/7/5 7:58:16 阅读更多 →
全自动PACK生产线技术解析:嘉洛智能源头直供的智造方案

全自动PACK生产线技术解析:嘉洛智能源头直供的智造方案

随着新能源汽车与储能产业的爆发式增长,动力电池与储能电池的需求呈现井喷态势。作为连接电芯与终端应用的关键环节,电池模组PACK生产线的自动化与智能化水平,直接决定了整个生产体系的成本效率、产品品质与交付能力。面对市场上琳琅满目的设…

2026/7/5 7:58:16 阅读更多 →
三轴MEMS传感器与PIC微控制器的运动追踪系统设计

三轴MEMS传感器与PIC微控制器的运动追踪系统设计

1. 三轴运动追踪系统的核心组件解析在工业自动化和消费电子领域,精确追踪物体在三维空间中的运动状态一直是个关键技术挑战。WSEN-ISDS(型号2536030320001)这款三轴MEMS传感器与PIC18F96J94微控制器的组合,为解决这个问题提供了高…

2026/7/5 7:52:15 阅读更多 →

日新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

月新闻