JavaScript 中函数 柯里化风格的运用

news2025/1/14 1:19:48

导语

当我第一次看见 柯里化 这个词语的时候,我也表现出一脸懵,在代码程序中,看见这种 “高大上”的一些词汇叫法的时候,下意识的会觉得这个概念很难很深奥,但是当冷静下来,去深究过后,就会发现,柯里化 无非就是 JavaScript 中高阶函数 的一种用法而已。


在这里插入图片描述

什么是 函数柯里化?

函数柯里化(function currying)就是一种将函数转换为只接受一个参数的形式的技术。它的基本思想是,将原来接受多个参数的函数转换为接受一个单独参数(通常是最左边的参数)的函数,并且返回一个新的函数,该函数接受剩余的参数并返回最终的结果。柯里化(currying)又可以称为 部分求值

怎么样,看到这里的时候,是不是被上面太过书面的的解释,给弄得感觉更加疑惑了。没关系,下面我给大家举几个 柯里化 的使用案例。


//普通函数 求和
function sum(x, y, z) {
  return x + y + z;
}

let call = sun(10, 20, 30);
console.log(call);

//柯里化 (currying) 处理后求和

function sumKe(x) {
  return function (y) {
    return function (z) {
      return x + y + z;
    };
  };
 }
let result = sumKe(10)(20)(30);   // 柯里化 调用
console.log(result);

不知道大家从上面的示例中,有没有看出来函数 柯里化 的用法,以及它的作用。

示例中实际上就是把 sumKe 函数的x,y,z 三个参数变成了先用一个函数接收 x 然后返回一个函数去处理 y 参数,再返回一个 函数去处理 z 的参数,最后再返回总结果。

其实总结上面的示例,就可以看出 调用 sumKe 函数的时候,类似于 链式调用。

其实说到这里,肯定有不少小伙伴,会疑惑,从字面上看 柯里化 过后的函数, 反而是 变得更加的复杂化了,这和我们 最终的目的 是相悖论的。那么 柯里化 的最直观的作用 体现在哪里?

下面我再给大家一个示例

//普通函数
function option(param) {
  console.log("开始执行");
  if (param) {
    console.log(param);
  } else {
    console.log(param);
  }
 }
option(true);  
option(true);
option(true);

在这里插入图片描述

如上案例,如果我们多次调用,则每次都会完整重复的 执行完 整个 option 函数,每次都会 执行 if… else…

那么我们现在的需求是,多次 调用 option 函数 却只执行一次 if … else…。
针对此需求,对函数进行 柯里化处理,就可以完美实现

function option(param) {
  console.log("开始执行");
  if (param) {
    return () => console.log(param);
  } else {
    return () => console.log(param);
  }
 }
 let currying = option(true);
 currying();
 currying();
 currying();

在这里插入图片描述
在通过 柯里化 处理过后的 函数,大家都看到了, “开始执行” 4个字,只执行了一次, 相比于没有通过柯里化处理的函数,每次调用都会执行,显得简练化了不少。

其实这里对函数柯里化,可以这么理解:

一个柯里化的函数首先会接收一些参数,接收了这些参数后,该函数并不会立即求值,而是继续返回另外一个函数,刚才传入的参数在函数形成的闭包中被保存起来。待到函数被真正需要求值的时候,之前传入的所有参数都会被一次性用于求值。这也对应了,前面提到的,柯里化 又称为部分求值。

使用场景

函数柯里化的使用场景,比如说,有时候我们需要通过调用函数,动态的,给函数内部传递参数,但是其中大部分参数都是固定的,只有极少数的参数,每次传递都不一样,这时候,我们就可以对函数使用 柯里化 的方式,进行封装,把相同的一些参数,给固定下来,然后返回一个新的函数,在新的函数中,对每次都是新参数的业务进行处理,这样一来,整个函数就变得,整合性,不同的函数,关注于 各自的 核心业务逻辑。


总结

本篇章,给大家带来了,在 JavaScript 中,如何对函数进行 柯里化 的封装处理,以及柯里化处理后,带来的优势,供大家阅读。同时大家在遇到很多高大上 的词汇 语法的时候,大家先不要慌,去深究过后,就会发现绝大多数,概念性知识点,也可以被我们所掌握。


🚵‍♂️ 博主座右铭:向阳而生,我还在路上!
——————————————————————————————
🚴博主想说:将持续性为社区输出自己的资源,同时也见证自己的进步!
——————————————————————————————
🤼‍♂️ 如果都看到这了,博主希望留下你的足迹!【📂收藏!👍点赞!✍️评论!】
——————————————————————————————

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Jetson 学习笔记(十六):使用SDK Manager烧录Jetson Nano

SDK Manager 前期准备开始安装 前期准备 安装VMware虚拟机,Ubuntu系统,VMware tools,然后在Ubuntu中安装Nvidia SDK Manager,最后进行烧录。 VMware、Ubuntu系统以及VMware tools:安装链接Nvidia SDK Manager&#x…

ArcGIS Pro数据

目录 1 数据模型 1.1 矢量数据 1.2 栅格数据 1.2.1 栅格数据用途 1.2.2 影像数据地理属性 1.2.3 影像分辨率 1.2.4 栅格波段 2 常用数据格式 2.1 CAD 2.1.1 CAD格式 2.1.2 CAD要素数据集 2.1.3 CAD要素数据集要素类 2.1.4 ArcGIS Pro支持的AutoCAD和MicroStation要…

为什么Web自动化测试需要掌握多种技能?看完就知道了

B站首推!2023最详细自动化测试合集,小白皆可掌握,让测试变得简单、快捷、可靠https://www.bilibili.com/video/BV1ua4y1V7Db 目录 1.编程语言 2.Web开发知识 3.自动化测试框架 4.版本控制系统 5.数据库基础知识 历史进程:…

详解RocketMQ ACL机制的设计实现原理

一、序言 RocketMQ在4.4版本之后为我们提供了ACL权限校验机制,可以实现针对Topic资源级别的用户访问权限控制,ACL的实现能够在一定程度上保证RocketMQ集群数据的安全性。试想一下,如果没有ACL权限校验,在生产环境上只要部署任意的RocketMQ控制台就可以对topic进行操作,存…

【无人机】无人机平台的非移动 GPS 干扰器进行位置估计的多种传感器融合算法的性能分析(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

如何通过 8 个必备技巧确定工作任务的优先级

你的每项任务都同样紧急吗? 你是否制定了一个简单的待办事项清单,并从头到尾地完成每一项任务? 如果你实际上没有对任务进行优先排序,那么这个项目会被拉长。当你不知道如何根据你或你的团队的效率进度来确定项目的优先次序时&a…

Flutter 透明视频播放插件——基于字节跳动AlphaPlayer

字节跳动:AlphaPlayer GitHub - bytedance/AlphaPlayer: AlphaPlayer is a video animation engine. 关于透明视频 透明视频的播放,对于webm格式的视频,在h5上面是很容易播放的 但是对于android或者flutter来说,尤其flutter的…

PoE、PoE+、PoE++交换机功率用途有何不同

随着网络部署终端的设备越来越多,场景千差万别、布署时间有先有后,因此通过PoE交换机为其远程供电是最佳的选择。我们一般常见的PoE、PoE交换机比较多,PoE目前还有待进一步被人了解,这三款的区别可以从历史进程上来进行总结归纳。…

【linux-进程2】进程控制

🌈环境变量 🍄初识 系统带的命令可以直接运行(ls ll命令等),但是我们自己写的命令必须要带上路径才能运行(./myproc),这是什么原因导致的?如果我们也想自己写的命令直接…

实时数仓--数据实时接入模块相关视频录制完成

数据实时接入部分的视频已于昨晚录制完成,由于视频中涉及实现思路和实现代码都来自生产项目,且经过作者多次熬夜录制完成,所以这套视频需付费观看,介意的朋友请见谅。 具体说明如下: 对《实时数仓架构那些事儿》系列文…

【LeetCode】404. 左叶子之和

1.问题 给定二叉树的根节点 root ,返回所有左叶子之和。 示例 1 输入: root [3,9,20,null,null,15,7] 输出: 24 解释: 在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24 示例 2 输入: root [1] 输出: 0 提示: 节点数…

day4-中等篇-环形链表2

这是环形链表的升级版,也就是找到尾部连接的第二个节点并返回; 分两步:第一步判断是否有环,第二步找到节点 为什么找到节点是这样?原因是快慢指针相遇之后,慢指针到head的距离和新指针q到head的距离相同&am…

Koa2的基本使用

一、新建一个文件夹 首先打开终端,输入node -V命令检查Node版本,对于Koa2框架需要Node版本高于7.6使用npm init -y这个命令可以快速创建出package.json文件使用npm install koa下载最新版本koa到当前项目 二、初步使用 创建app.js // 创建koa对象 c…

FPGA时序约束(四)主时钟、虚拟时钟和时钟特性的约束

系列文章目录 FPGA时序约束(一)基本概念入门及简单语法 FPGA时序约束(二)利用Quartus18对Altera进行时序约束 FPGA时序约束(三)时序约束基本路径的深入分析 文章目录 系列文章目录前言主时钟约束跨时钟域…

“echo >”和“echo >>”的区别

“echo >”和“echo >>”的区别 命令“echo >”代表输出重定向 命令“echo >>”输出追加重定向 echo hello A 将字符串hello A输出到屏幕 echo hello A > tmp.txt 将字符串输出重定向,当前目录没有tmp.txt,则创建tmp.txt&#xff…

wangEditor5在Vue3中的自定义图片+视频+音频菜单

本文适用于wangEditor5用在Vue3中自定义扩展音频、视频、图片菜单;并扩展音频元素节点,保证音频节点的插入、读取、回写功能正常;支持动态修改尺寸。适用于初学者。 1、官网关键文档。 ButtonMenu:自定义扩展新功能 | wangEdito…

所有Gcc版本对C和C++的支持情况(超详细版本)

在最近接触的新的项目,由于技术使用为C98风格实现,遇到一个问题需要加锁解决,本能反应用lock_guradmutex解决,但是没设置CFLAGS为C11标准,不确定当前gcc编译器默认支持的C和C标准是什么,索性就一把都研究透…

G - 李华和图案

第一周刷题: 【题目描述】 李华有大小的格局nn,每个单元格为蓝色或红色。他可以表演完全k操作。在每次操作中,他选择一个单元格并将其颜色从红色更改为蓝色或从蓝色更改为红色。每个单元格都可以根据需要多次选择。是否有可能使图案与其旋转…

Vue-高德地图-立体多边形绘制

前言 在前端开发中,地图展示是常见的需求之一。而高德地图作为国内知名的地图服务商,其提供的 API 功能丰富,使用也相对简单。 本篇文章将介绍如何在 Vue2 中使用 amap/amap-jsapi-loader 安装高德地图并展示地图。 准备工作 首先需要在高…

02 【Sass语法介绍-变量】

sass有两种语法格式Sass(早期的缩进格式:Indented Sass)和SCSS(Sassy CSS) 目前最常用的是SCSS,任何css文件将后缀改为scss,都可以直接使用Sassy CSS语法编写。 所有有效的 CSS 也同样都是有效的 SCSS。 Sass语法介绍-变量 1.前言 Sass …