JavaScript 如何理解柯里化函数结构及调用

文章目录

  • 柯里化函数是什么
  • 逐步理解柯里化函数

柯里化函数是什么

柯里化(Currying)函数,又称部分求值,是一种函数转换技术。这种技术将一个接受多个参数的函数转换为一系列接受单一参数的函数。具体来说,一个柯里化的函数首先会接收一些参数,但并不会立即求值,而是返回另一个函数。之前传入的参数在函数形成的闭包中被保存起来,直到所有需要的参数都被传入,函数才会被真正求值。

逐步理解柯里化函数

本质上,柯里化函数是返回了一个函数体,进而通过该函数体接收参数并进行求值计算。
以柯里化函数调用为例进行反推:

add(1, 2)(3, 4)

这个结构初看可能不太容易理解,但我们可以从函数的基础用法开始联想。

function demo() {  
    console.log('demo');  
}  
  
demo();

在这个例子中,demo 是一个函数,它被直接调用。如果我们想要将函数体作为返回值(立即执行函数),可以这样做:

(function demo() {  
    console.log('demo');  
})();

当我们想要给这个函数传递参数时,可以这样做:

(function demo(a, b) {  
    console.log('demo', a + b);  
})(3, 4);

这段代码执行后,会立即执行该函数,并传入值 3 和 4,控制台会打印出 demo 7。
接下来,如果我们想要调用另一个函数,并返回 demo 函数,以便可以再次调用 demo 函数,可以这样做

function demo(a, b) {  
    console.log('demo', a + b);  
}  
  
function sum(a, b) {  
    return demo; // 注意这里只是返回了函数,并没有执行  
}  
  
let test = sum(1, 2); // 此时 test 接收的值为 demo 函数  
test(3, 4); // 触发 test 即为触发 demo 函数,控制台输出 demo 7

如果将test简化去掉,可以得到

function demo(a,b){
	console.log('demo',a+b)
}
function sum(a,b){
	return demo //此时函数未执行
}
sum(1,2)(3,4)

此时sum函数的执行体,与柯里化函数执行体已经高度相似了,最后整合一下接收值

function sum(a,b){
	return (c,d)=>{
		console.log('demo',a,b,c,d)
	}
}
sum(1,2)(3,4)

此时控制台输出demo 1 2 3 4

因为a,b是外层函数输入的,c,d是返回函数接收的,同时返回函数在外层函数环境内,可以取到a,b值
最后,我们处理一下求值,可得到

function sum(a,b){
	return (c,d)=>{
		return a+b+c+d
	}
}
sum(1,2)(3,4) //10


function sum2(a,b){
	return (c)=>{
		return a+b+c+d
	}
}
sum2(1,2)(3) //6

一个基础版本柯里化函数完成了
简图方便理解一下
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/590757.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【研发管理】产品经理知识体系-组合管理

导读:新产品开发的组合管理是一个重要的过程,它涉及到对一系列新产品开发项目进行策略性选择、优先级排序、资源分配和监控。这个过程旨在确保企业能够最大化地利用有限的资源,以实现其战略目标。 目录 1、组合管理、五大目标 2、组合管理的…

张大哥笔记:付费进群创业项目玩法及详细操作教程

今天给大家分享一个赚钱小项目,它就是付费进群系统,这个项目应用范围很广。比如表情包,知识付费,美女写真,虚拟资料,交友扩列等都可以。今天我们就来说一下最近爆火的交友搭子付费进群做个演示案例&#xf…

线性卷积和圆周卷积

文章目录 【 1. 线性卷积 】1.1 图解分析1.2 矩阵相乘实现线性卷积1.3 圆周卷积实现线性卷积1.4 实例:线性卷积的两种实现方法【 2. 圆周卷积 】2.1 图解分析2.2 矩阵相乘实现圆周卷积2.3 频域点乘实现圆周卷积2.4 实例:圆周卷积两种实现方法【 3. 线性卷积和圆周卷积的等价 …

题目:吃奶酪

问题描述: 解题思路: 枚举每种吃奶酪顺序,并计算其距离,选择最小的距离即答案。v数组:记录顺序。 注意点:1. 每次用于min的s需要重置为0。 2. 实数包括小数,所以结构体内x,y为double类型。 3. 第…

基数排序简记

今天手敲 基数排序 代码的时候发现结果不对,这里简记一下原因。 第一版代码(错误) public void radixSort(int[] arr) {// 1. 获取 arr 的最大位数int maxDigit Arrays.stream(arr).max().getAsInt();int maxLen String.valueOf(maxDigit…

赵本山:吃恐龙没?范伟:我想吃我吃的着吗?!

赵本山:吃恐龙没?范伟:我想吃我吃的着吗?! ——小品《升职》(中2)的台词 (接上) 赵本山:据我多年的破案经验 一般罪犯心理这个时候都是手舞足蹈抓耳挠腮 …

算法导论 总结索引 | 第三部分 第十二章:二叉搜索树

1、搜索树数据结构 支持 许多动态集合操作,包括 SEARCH、MINIMUM、MAXIMUM、PREDECESSOR、SUCCESSOR、INSERT 和 DELETE 等。使用搜索树 既可以作为一个字典 又可以作为一个优先队列 2、二叉搜索树上的基本操作 所花费的时间 与这棵树的高度成正比。对于有n个结点的…

Android应用程序构成

binder Android应用程序是由Activity、 Service、 Broadcast Receiver和 Content Provider四种类型的组件构成的, 它们有可能运行在同一个进程中, 也有可能运行在不同的进程中。 此外, 各种系统组件也运行在独立的进程中, 例如&a…

如何基于nginx组建多个子目录网站

华子目录 实验要求实验步骤 实验要求 组建多个子目录网站www.openlab.com,该网站有2个子目录www.openlab.com/sxhkt和www.openlab.com/zywww.openlab.com/sxhkt使用http读取www.openlab.com/zy使用https读取 实验步骤 准备工作 [rootserver ~]# setenforce 0[ro…

Matlab|基于多目标粒子群算法的微电网优化调度

目录 1 主要内容 2 部分代码 3 效果图 4 下载链接 1 主要内容 本程序为《基于多目标粒子群算法的微电网优化调度》-王金全文章的方法复现,考虑因素较文章复杂,除了考虑基本机组、储能等的出力,还考虑了弃风和弃光,很值得大家…

Docker Compose如何安装

Docker Compose的安装通常依赖于你的操作系统。以下是在不同操作系统中安装Docker Compose的方法: Linux 系统 //下载最新版本的Docker Compose sudo curl -L "https://github.com/docker/compose/releases/download/v2.5.1/docker-compose-$(uname -s)-$(un…

大厂可视化平台之百度SugarBI:让数据价值一“幕”了然。

百度Sugar是百度智能云推出的敏捷BI和数据可视化平台,可以说是生产力具。 它旨在解决报表和大屏的数据BI分析和可视化问题,同时也是为了解放数据可视化系统的开发人力。百度Sugar基于百度Echarts提供丰富的图表组件,使得用户可以开箱即用、零…

spring框架学习记录(1)

前半个月一直在应付期中考试,快被折磨似了orz 文章目录 SpringIoC(Inversion of Control) 控制反转与DI(Dependency Injection)依赖注入bean相关bean配置bean实例化bean的生命周期 依赖注入相关依赖注入方式依赖自动装配 容器创建容器获取bean Spring IoC(Inversi…

Linux进程——Linux下常见的进程状态

前言:在进程学习这一块,我们主要学习的就是PCB这个进程控制块,而PBC就是用来描述进程的结构体,而进程状态就是PCB结构体中的一个变量。 本篇主要内容: 操作系统中的进程状态Linux下的进程状态 在开始之前,我…

Redis学习笔记(基础)

Redis学习笔记(基础) 一、Nosql概述1.1、为什么使用Nosql1.2、什么是Nosql1.3、阿里巴巴演进分析1.4、NoSQL的四大分类 二、 Redis入门2.1、概述2.2、Windows使用Redis2.3、linux安装2.4、redis-benchmark性能测试2.5、Redis基础知识 三、五大数据类型3.…

Linux专栏08:Linux基本指令之压缩解压缩指令

博客主页:Duck Bro 博客主页系列专栏:Linux专栏关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ Linux基本指令之压缩解压缩指令 编号:08 文章目录 Linu…

初始Java篇(JavaSE基础语法)(7)抽象类和接口(上)

找往期文章包括但不限于本期文章中不懂的知识点: 个人主页:我要学编程(ಥ_ಥ)-CSDN博客 所属专栏:JavaSE 目录 抽象类 抽象类的概念: 抽象类语法 抽象类特性 抽象类的作用 接口 接口的概念: 语法规则 接口…

ssm104园区停车管理系统+jsp

园区停车管理系统的设计与实现 摘 要 网络技术和计算机技术发展至今,已经拥有了深厚的理论基础,并在现实中进行了充分运用,尤其是基于计算机运行的软件更是受到各界的关注。加上现在人们已经步入信息时代,所以对于信息的宣传和管…

Atlassian Jira 信息泄露漏洞(CVE-2019-3403) 排查思路

Atlassian Jira: 企业广泛使用的项目与事务跟踪工具,被广泛应用于缺陷跟踪、客户服务、需求收集、流程审批、任务跟踪、项目跟踪和敏捷管理等工作领域。 简述: 近日发现多个内网IP触发的Atlassian Jira 信息泄露漏洞的告警。 告警的检测规…

C语言:内存操作函数memcpy、memmove、memset和memcpy的使用和模拟实现

一&#xff1a;memcpy的使用和模拟 memcpy使用时需要包含的头文件为#include<string.h> void* memcpy(void* destination,const void* source,size_t num) 函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置&#xff08;特别注意的是…