导语
当我第一次看见
柯里化
这个词语的时候,我也表现出一脸懵,在代码程序中,看见这种 “高大上”的一些词汇叫法的时候,下意识的会觉得这个概念很难很深奥,但是当冷静下来,去深究过后,就会发现,柯里化
无非就是 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 中,如何对函数进行 柯里化 的封装处理,以及柯里化处理后,带来的优势,供大家阅读。同时大家在遇到很多高大上 的词汇 语法的时候,大家先不要慌,去深究过后,就会发现绝大多数,概念性知识点,也可以被我们所掌握。
🚵♂️ 博主座右铭:向阳而生,我还在路上!
——————————————————————————————
🚴博主想说:将持续性为社区输出自己的资源,同时也见证自己的进步!
——————————————————————————————
🤼♂️ 如果都看到这了,博主希望留下你的足迹!【📂收藏!👍点赞!✍️评论!】
——————————————————————————————