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

导语

当我第一次看见 柯里化 这个词语的时候,我也表现出一脸懵,在代码程序中,看见这种 “高大上”的一些词汇叫法的时候,下意识的会觉得这个概念很难很深奥,但是当冷静下来,去深究过后,就会发现,柯里化 无非就是 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 中,如何对函数进行 柯里化 的封装处理,以及柯里化处理后,带来的优势,供大家阅读。同时大家在遇到很多高大上 的词汇 语法的时候,大家先不要慌,去深究过后,就会发现绝大多数,概念性知识点,也可以被我们所掌握。


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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

旧梦星轨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值