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

JS | 函数柯里化

函数柯里化(Currying:将一个接收多个参数函数,转换为一系列只接受一个参数的函数的过程。即 逐个接收参数


例子:

普通函数:

function add(a, b, c) {return a + b + c;
}
add(1, 2, 3); // 输出 6

柯里化版本:

function curriedAdd(a) {return function (b) {return function (c) {return a + b + c;};};
}
curriedAdd(1)(2)(3); // 输出 6


📌 二、柯里化函数源码详解

function curry(fn, argLength){return function curried(...args) {if(args.length >= argLength) {    // 当传入的参数大于期望的参数时,即 参数个数够了return fn.apply(this, args)} else {return function(...args2){    // 当传入的参数不够时,递归调用函数,并进行拼接return curried.apply(this, args.concat(args2));}}}
}

✅ 三、逐行解释 curry 函数


🔹 function curry(fn, argLength)

  • fn:柯里化的目标函数,如 add(a, b, c)

  • argLength期望的参数个数


🔹 return function curried(...args) {

  • 返回一个新函数 curried,用于收集传入的参数

  • args 当前接收到的参数集合(可能不全)


🔹 if (args.length >= argLength)

  • 如果参数够了,说明我们已经收集完了所需的参数

✅ 执行目标函数:

return fn.apply(this, args)

  • 调用原函数 fn,传入完整参数 args

  • 使用 .apply() 是为了把数组参数展开执行

.apply( this的值要传递给函数的参数 ) —— Function.prototype.apply

fn.apply(thisArg, [argsArray])

等价于

fn(...argsArray)

是 js 中函数的内置方法,用来"调用"一个函数,并显示指定(两个参数):

  • “this”指向
  • “参数数组传入方式”——> 可以是数组或者类数组对象,表示要传递给函数的参数

例子:

function sayHi(name, age){console.log(`${name} is ${age} years old.`);
}sayHi.apply(null, ['Alice', 25]);    // 输出 Alice is 25 years old.

🔹 else { return function(...args2) { ... }}

  • 如果参数还不够,返回一个新的函数,继续收集参数

⚡ 重点:

return curried.apply(this, args.concat(args2))

  • 把之前的参数 args 和现在的参数 args2 合并

  • 再次调用 curried 自身,形成递归


✅ 五、总结对比表

行为对象目的触发条件
fn.apply(this, args)原始函数执行目标函数参数数量足够
curried.apply(this, args.concat(args2))柯里化函数自身递归收集参数参数不够

例题:牛客 JS56 返回函数

    相关文章:

    JS | 函数柯里化

    函数柯里化(Currying):将一个接收多个参数函数,转换为一系列只接受一个参数的函数的过程。即 逐个接收参数。 例子: 普通函数: function add(a, b, c) {return a b c; } add(1, 2, 3); // 输出 6柯里化…...

    软件工程基础之设计模式

    目录 单例模式(Singleton Pattern)工厂方法模式(Factory Method Pattern)抽象工厂模式(Abstract Factory Pattern)原型模式(Prototype Pattern)适配器模式(Adapter Pattern)单例模式(Singleton Pattern) 确保一个类只有一个实例,并提供一个全局访问点。应用场景:…...

    2025 数字中国创新大赛数字安全赛道数据安全产业积分争夺赛初赛-东部赛区WriteUp

    2025 数字中国创新大赛数字安全赛道数据安全产业积分争夺赛初赛-东部赛区WriteUp 数据安全:ez_upload(60分): 模型安全:数据分析:溯源与取证:1-1:1-2: 数据社工:2-2:2-3:2-4: 数据跨境&#xff…...

    2025 年网络安全终极指南

    我们生活在一个科技已成为日常生活不可分割的一部分的时代。对数字世界的依赖性日益增强的也带来了更大的网络风险。 网络安全并不是IT专家的专属特权,而是所有用户的共同责任。通过简单的行动,我们可以保护我们的数据、隐私和财务,降低成为…...

    1.6-抓包技术(Burp Suite\Yakit抓包\Web、APP、小程序)

    1.6-抓包技术(Burp Suite\Yakit抓包\Web、APP、小程序) 如果要使用抓包软件,基本上第一步都是要安装证书的。原因如下: 客户端(浏览器或应用)会检测到证书不受信任,并弹出 证书错误&#xff0…...

    图解力扣回溯及剪枝问题的模板应用

    文章目录 选哪个的问题17. 电话号码的字母组合题目描述解题代码图解复杂度 选不选的问题78. 子集题目描述解题代码图解复杂度 两相转化77. 组合题目描述解题代码法一:按选哪个的思路法二:按选不选的思路 图解选哪个:选不选 复杂度 选哪个的问…...

    Elasticsearch 8.X 如何利用嵌入向量提升搜索能力?

    众所周知,Elasticsearch 是一个非常流行的搜索引擎,因为它速度快、扩展性强,尤其擅长全文搜索。 近两年,向量嵌入(Vector Embedding)技术的引入,让 Elasticsearch 在处理高级搜索场景时变得更强…...

    MySQL体系架构(一)

    1.1.MySQL的分支与变种 MySQL变种有好几个,主要有三个久经考验的主流变种:Percona Server,MariaDB和 Drizzle。它们都有活跃的用户社区和一些商业支持,均由独立的服务供应商支持。同时还有几个优秀的开源关系数据库,值得我们了解一下。 1.1.1.Drizzle Drizzle是真正的M…...

    【Docker项目实战】使用Docker部署ToDoList任务管理工具

    【Docker项目实战】使用Docker部署ToDoList任务管理工具 一、ToDoList介绍1.1 ToDoList简介1.2 ToDoList主要特点二、本次实践规划2.1 本地环境规划2.2 本次实践介绍三、本地环境检查3.1 检查Docker服务状态3.2 检查Docker版本3.3 检查docker compose 版本四、下载ToDoList镜像…...

    深度强化学习基础 0:通用学习方法

    过去自己学习深度强化学习的痛点: 只能看到各种术语、数学公式勉强看懂,没有建立清晰且准确关联 多变量交互关系浮于表面,有时候连环境、代理控制的变量都混淆 模型种类繁多,概念繁杂难整合、对比或复用,无框架分析所…...

    Traefik应用:配置容器多个网络时无法访问问题

    Traefik应用:配置容器多个网络时无法访问问题 介绍解决方法问题原因: **容器多网络归属导致 Traefik 无法正确发现路由规则**。解决方案方法 1:将应用容器 **仅连接** 到 traefik-public 网络方法 2:显式指定 Traefik 监听的网络 …...

    虚幻5的C++调试踩坑

    本地调试VS附加调试 踩坑1 预编译版本的UE5没有符号文件,无法调试源码 官方代码调试所需要的符号文件bdp需要下载导入。我安装的5.5.4是预编译版本,并非ue5源码。所以不含bdp文件。需要调试官方代码则需要通过EPIC中下载安装。右键UE版本,打…...

    react 中将生成二维码保存到相册

    需求:生成二维码,能保存到相册 框架用的 react 所以直接 qrcode.react 插件,然后直接用插件生成二维码,这里一定要写 renderAs{‘svg’} 属性,否则会报错,这里为什么会报错??&#…...

    通信协议详解(十):PSI5 —— 汽车安全传感器的“抗干扰狙击手”

    一、PSI5是什么? 一句话秒懂 PSI5就像传感器界的“防弹信使”:在汽车安全系统(如气囊)中,用两根线同时完成供电数据传输,即便车祸时线路受损,仍能确保关键信号准确送达! 基础概念…...

    C语言【模仿strcpy】

    题目 模仿strcpy 思路&#xff08;注意事项&#xff09; 注意需要在复制的字符串结尾加\0表示字符串的终止 纯代码 #include<stdio.h>void cpy(const char *a, char *b){int i 0;while (a[i] ! \0){b[i] a[i];i ;}b[i] \0; } int main(){char a[] "HELLO&quo…...

    从零开始学Python游戏编程18-函数3

    《从零开始学Python游戏编程17-函数2》中&#xff0c;通过代码重构的方式将游戏的主要代码写入到自定义函数runGame()中。对于runGame()中的代码&#xff0c;可以继续对其进行重构&#xff0c;以达到简化代码结构的目的。 1 自定义函数askPlayer() 1.1 函数作用 自定义函数a…...

    Spring事务传播机制

    Spring 事务传播机制定义了在多个事务方法相互调用时&#xff0c;事务如何在这些方法间传播。它决定了一个事务方法调用另一个事务方法时&#xff0c;新的事务是如何开启、是否要加入已有的事务等情况。Spring 提供了 7 种事务传播行为&#xff0c;下面是详细介绍。 解释说明&…...

    不同PHP框架之间的兼容性问题及应对策略!

    在PHP开发领域&#xff0c;Laravel、Symfony、Yii、ThinkPHP、亿坊PHP等框架因其高效性和便捷性广受开发者青睐。但当项目需要跨框架协作或迁移时&#xff0c;兼容性问题直击要害。本文将从实际案例出发&#xff0c;剖析不同PHP框架间常见的兼容性痛点&#xff0c;并为大家提供…...

    Qt 子项目依赖管理:从原理到实践的最佳分析:depends还是 CONFIG += ordered

    1. 问题背景 在Qt项目开发中&#xff0c;当一个工程包含多个子项目&#xff08;如库、插件、测试模块&#xff09;时&#xff0c;如何正确管理它们的构建顺序和依赖关系&#xff1f; 如&#xff1a; 在开发一个包含核心库&#xff08;core&#xff09;、GUI模块&#xff08;g…...

    大数据专业学习路线

    大数据专业学习路线 目录 基础知识核心技术进阶技能实战项目职业发展学习资源学习计划常见问题 1. 基础知识 1.1 编程语言 Python&#xff1a;大数据分析的基础语言 基础语法和数据类型函数和模块面向对象编程文件操作和异常处理常用库&#xff1a;NumPy, Pandas, Matplot…...

    点云从入门到精通技术详解100篇-基于点云的三维多目标追踪与目标检测

    目录 知识储备 基于Python和Open3D库实现的三维点云多目标检测与跟踪 技术要点解析 : 运行环境配置: 扩展改进建议 : 前言 三维多目标追踪技术 点云目标检测算法 2 二维多目标追踪框架及三维点云目标检测 2.1 二维多目标追踪框架 2.1.1 Deep SORT总体架构 2.1…...

    dubbo配置中心

    配置中心 简介 配置中心&#xff08;config-center&#xff09;在dubbo中可承担两类职责&#xff1a; 外部化配置&#xff1a;启动配置的集中式存储。流量治理规则存储。 Dubbo动态配置中心定义了两个不同层次的隔离选项&#xff0c;分别是namespace和group。 namespace&a…...

    Java常用工具算法-5--哈希算法、加密算法、签名算法关系梳理

    1、哈希算法 数学本质&#xff1a;将任意长度输入&#xff08;明文&#xff09;映射为固定长度输出&#xff08;哈希值&#xff0c;也称摘要&#xff09;。主要特点&#xff1a; 不可逆性&#xff1a;无法通过哈希值反推原始输入。雪崩效应&#xff1a;输入的微小变化导致哈希…...

    python之安装PaddlePaddle和PaddleX解析pdf表格

    目录标题 飞桨PaddlePaddle本地安装教程1-1. 基于 Docker 安装飞桨1-2. 基于 pip 安装飞桨2. 我两个环境 都选择的是pip 安装10. 如果报错10. 离线安装 飞桨PaddlePaddle本地安装教程 源码下载&#xff1a;https://github.com/PaddlePaddle/PaddleX/blob/release/3.0-beta1/do…...

    【11408学习记录】英语语法核心突破:揭秘表语从句结构与通知写作实战技巧

    表语从句与通知写作 英语语法总结——主从复合句表语从句语句结构系动词表语从句的位置 写作通知写作第二段第三段落款 每日一句词汇第一步&#xff1a;找谓语第二步&#xff1a;断句第三步&#xff1a;简化第一句第二句第三句第四句第五句 英语 语法总结——主从复合句 表语…...

    React Native 0.79发布 - 更快的工具及更多改进

    React Native 0.79版本发布了。 此版本在多个方面进行了性能改进&#xff0c;并修复了一些漏洞。首先&#xff0c;得益于延迟哈希技术&#xff0c;Metro的启动速度变快了&#xff0c;并且对包导出提供了稳定支持。由于JS包压缩方式的改变等原因&#xff0c;Android的启动时间也…...

    封装红黑树实现map和set

    前言&#xff1a; 之前我们学习了set与map容器的如何使用&#xff0c;红黑树的实现。接下来我们来看看如何通过封装红黑树&#xff0c;实现我们自己的set与map 相关文章&#xff1a;oi&#xff01;让我来给你唠唠咋实现红黑树☝️-CSDN博客 超详细介绍map&…...

    解码AI大脑:Claude的思维显微镜与语言炼金术

    &#xff08;前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff09;。 一、多语言思维实验&#xff1a;Claude的“概念空间”如何运转&#xff1f; 跨语言谜题&#xff1a;反义词的…...

    中科岩创基坑自动化监测解决方案

    1.行业现状 城市基坑开挖具有施工风险高、施工难度大等特点。由于地下土体性质、荷载条件、施工环境的复杂性&#xff0c;单根据地质勘察资料和室内土工试验参数来确定设计和施工方案&#xff0c;往往含有许多不确定因素&#xff0c;对在施工过程中引发的土体性状、环境、邻近建…...

    机器学习01-支持向量机(SVM)(未完)

    参考浙大 胡浩基老师 的课以及以下链接&#xff1a; https://blog.csdn.net/m0_74100344/article/details/139560508 https://blog.csdn.net/2301_78630677/article/details/132657023 https://blog.csdn.net/lsb2002/article/details/131338700 一、一些定义 T是倒置&…...