持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第3天,点击查看活动详情
题外话
这个疫情啊,真滴是服气了,居家快一个月了,居家不是办公就是做饭,脑子都快麻木了,为了活跃自己的大脑,也为了帮助大家增长知识,我给大家分享一点冷知识,嘿嘿嘿……
冷知识:水母没有眼睛和心脏,但它的触角却能发射电磁波与磁场感应,以此感知外部世界。
咳咳~进入正题吧
开始
之前的两篇里面我们介绍了什么是
纯函数 :函数纯函数
函数柯里化:函数柯里化
下面我们接着详细的介绍函数柯里化的一些特性,这些特性也是上一篇结尾的时候简单的介绍了,接下来就详细的看看函数柯里化后具有那些特性
柯里化的特性
单一职责
我们希望一个函数处理的问题尽可能的单一,我们就可以将每次传入的参数在单一的函数中进行处理,处理之后在下一个函数中再使用处理过的参数结果。
举个简单的例子,加入我们有3个参数x,y,z,我们需要x加2,y乘2,z平方之后返回给我们最终结果,我们可能会这样写
function foo(x, y, z) {
x += 2
y *= 2
z *= z
return x + y + z
}
var result = foo(1, 2, 3)
console.log(result);
那如果我们将上面这段代码柯里化呢,我们需要怎么将参数分开操作呢
function fn(x) {
x += 2
return function (y) {
y *= 2
return function (z) {
z *= z
return x + y + z
}
}
}
var result = fn(1)(2)(3)
console.log(result);
这样我们就能阻止,一个参数处理完毕之后,在执行后面的方法。
逻辑的复用
我们一定会遇见一个函数需要多次调用和执行,比如下面这段代码
function foo(a, b) {
return a + b
}
var result = foo(1, 3)
console.log(result);
假如我每次传入的a的实例都是固定的数值,那么我们还需要每次都foo(1, 2),foo(1, 3)等等,这样去调用吗,我们为什么不将固定数值进行柯里化呢?
function fn(a) {
return function (b) {
return a + b
}
}
var result = fn(1)(2)
console.log(result);
//柯里化复用
var resultAdd = fn(1)
var result = resultAdd(2)
console.log(result);
这样,我们之后就可以直接调用resultAdd这个函数传参即可。
柯里化案例
这里我们以打印日志为例子 未将函数柯里化
function log(data, type, message) {
console.log(`[${data.getHours()}:${data.getMinutes()}][${type}]:[${message}]`);
}
log(new Date(), "DEBUG", "出现bug")
//[22:40][DEBUG]:[出现bug]
柯里化后
var log = data => type => message => {
console.log(`[${data.getHours()}:${data.getMinutes()}][${type}]:[${message}]`);
}
var newLog = log(new Date())
var newType = newLog("DEBUG")
var newMessage = newType("出现bug")
console.log(newMessage);
这样,我们就可以将同一个类别的错误都归总到一个变量上面,不需要每次调用的时候调用最初始的那个函数。
结束
这一篇我们针对特定的函数进行个柯里化的处理,那么如果我们拥有很多函数都需要进行柯里化呢,难道还要一个一个进行柯里化吗,当然不能!!! 预告:下一篇我们将一个通用的柯里化函数