什么是函数柯里化Currying?怎么实现?柯里化封装?

news/2024/11/30 1:32:24/

什么是柯里化?

英文:currying

柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术。

柯里化也可以理解为:提前接收部分参数,延迟执行,不立即输出结果,而是返回一个接受剩余参数的函数。因为这样的特性,也被称为部分计算函数。柯里化,是一个逐步接收参数的过程。

举个例子,假设有一个加法函数:

function add(x, y) {return x + y;
}

我们可以将其柯里化为:

function add(x) {return function(y) {return x + y;}
}

这样,我们就可以通过连续调用返回的函数来实现多参调用:

add(2)(3) // 5

 函数柯里化常用于函数式编程,可以帮助我们简化代码、提高代码的复用性和可读性。

柯里化原理 

  1. 创建一个闭包函数,用来保存原始函数和已经部分应用的参数。
  2. 返回一个新函数,新函数接收一个单独的参数,将它和闭包函数中已经部分应用的参数合并,并调用原始函数。
  3. 如果新函数接收的参数个数小于原始函数的参数个数,递归调用步骤2,否则返回原始函数的执行结果。

柯里化封装,需要柯里化的函数直接调用该方法: 

function sum(a,b,c,d){return a+b+c+d;
}// 把sum(a,b,c,d)转成 sum(a)(b)(c)(d);function curry(cb,arr=[]){return function(...args){let arrs = [...arr,...args];if(arrs.length<cb.length){//判断实参个数是否和原函数的形参个数的关系return curry.call(this,cb,arrs)//调用闭包时,传入arrs,把前面调用的状态进行保持。}else{return cb(...arrs);}}
}let sfn = curry(sum);// let s = sfn(a)(b)(c)(d);
// let s = sfn(1)(2)(3)(4);
// let s = sfn(1,2)(3)(4);
let s = sfn(1,2,3,4);
console.log(s);

该函数接受一个函数作为参数,返回一个新的函数。新函数通过递归调用自身,把参数分解为多个较小的参数列表,最终返回原始函数的结果。 

 柯里化进阶封装:

const curry = (fn, arr = []) => (...args) => (arg => arg.length === fn.length ? fn(...arg) : curry(fn, arg)
)([...arr, ...args])

curry()函数实际上就是完成了参数的收集和整理,最终,还是调用原函数本身。  

柯里化的使用场景:  

        延迟执行函数:将某些函数的计算推迟到后面再执行,可以使用柯里化来生成一个新的函数,等到需要计算时再调用。

        引用部分参数:在某些情况下,我们想保留一部分参数,并在后续的函数调用中重用这些参数。使用柯里化可以生成一个新函数,仅保留传递的参数,而将其他参数预留给稍后调用该函数使用。

        函数重用:柯里化还可以用于在多个地方重用同一函数,但是每次使用的参数可能不同。将函数柯里化后,可以重复使用该函数,并传递不同的参数,从而实现代码的重用。

        部分应用函数:柯里化还可以用于部分应用函数,即通过对函数进行柯里化,将一个函数转换为另一个函数,该函数仅接受部分参数。这使得我们可以在需要的时候将剩余的参数传递给函数,从而执行该函数。

总的来说,柯里化可以用于任何需要将多个参数的函数转换为单个参数函数的情况。它可以简化代码,使函数更容易重用,并允许更灵活和动态地使用它们。

 

 

 

 

 

 

 

 


http://www.ppmy.cn/news/126408.html

相关文章

ARM64、x86基础知识介绍和区别

一. 概述 CPU的两大架构&#xff1a;ARM和X86。 ARM&#xff1a;ARM64是CPU构架的一种&#xff0c;通常用于手机、平板等CPU&#xff0c;目前笔记本电脑也会采用ARM64构架的CPU。 x86&#xff1a;x86是CPU构架的一种&#xff0c;通常用于笔记本电脑、台式电脑、服务器、超级计…

24届秋招专场·双指针巧解链表套路题

你好&#xff0c;我是安然无虞。 文章目录 合并两个有序链表分隔链表合并K个有序链表链表中倒数最后K个节点变形题: 删除链表的倒数第N个节点链表的中点判断链表是否有环环形链表II相交链表 大家好, 好久不见了, 从今天开始, 后面会经常更新笔试面试真题, 准备今年24届秋招的小…

四川地震捐助列表

&#xff08;本文转载自www.spdiy.com视频DIY家园&#xff09; 在此&#xff0c;我对这些募捐情况进行了一下大概的统计。。初步统计的可以看得见&#xff0c;有名有数的ZF&#xff0c;企业及个人的募捐款为&#xff1a;196492万元。另外再加上没有统计在内的各种救灾物质&am…

独立创业艰难所在

如今在我们IT类的行业中&#xff0c;许多都是独立创业的&#xff01;可又有谁知道独立创业的艰难所在呢&#xff1f; 1978 年&#xff0c;在中国历史上具有里程碑意义的十一届三中全会召开以后&#xff0c;沉睡的中国终于从“以阶级斗争为纲”的误区中解放出来&#xff0c;重新…

值得深思!!

一个大学生从月薪3500到700万和他的情感经 一个大学生从月薪3500到700万和他的情感经历——看了我挺震撼的&#xff0c;很佩服他的奋斗精神&#xff0c;特别推荐“三无”&#xff08;无背景&#xff0c;无势力&#xff0c;无家产&#xff09;的男生/希望靠自己奋斗成功的女生看…

HTML5期末大作业:京东网站设计——仿京东(7页) 大学生简单个人静态HTML网页设计作品 DIV布局个人介绍网页模板代码 DW学生个人网站制作成品下载

HTML5期末大作业&#xff1a;京东网站设计——仿京东(7页) 大学生简单个人静态HTML网页设计作品 DIV布局个人介绍网页模板代码 DW学生个人网站制作成品下载 常见网页设计作业题材有 个人、 美食、 公司、 学校、 旅游、 电商、 宠物、 电器、 茶叶、 家居、 酒店、 舞蹈、 动漫…

装修材料知名品牌有哪些?

品牌油漆&#xff1a; 华润漆 、大宝漆 、多乐士、 灯塔漆、 嘉宝莉、 大象油漆、 埃克森 、紫荆 花 、立邦油漆 、美涂士漆、 斯力宝、 三棵树 品牌地板&#xff1a; 莱茵春天、圣象 、菲林格尔、 德尔地板、 大自然、 金鹰艾格、 德国彩蝶 、柏高 、富得利、 吉象地板、 欧…

厨电行业不需要“愚蠢的小聪明创新”

文|智能相对论 作者|佘凯文 今年国内经济大环境依旧承压&#xff0c;“震荡”也成为了不少行业上半年的关键词。像厨电行业&#xff0c;受上半年原材料价格上涨、房地产刺激效应减弱等多方面影响&#xff0c;市场面临着巨大挑战。 不过震荡之下&#xff0c;也为厨电行业带去…