柯里化也是属于函数式编程里面非常重要的概念;
一种关于函数的高阶技术;不仅用在JavaScript,还用在其他编程语言。维基百科的解释:
在计算机科学中,柯里化(currying)是把接收的多个参数的函数,变成接收一个单一函数(最初函数的第一个参数)的函数,并且返回接收余下的参数,而且返回结果的新函数的技术;柯里化声称“如果你固定某些参数,你将得到接受余下参数的一个函数”;总结:
只传递给函数一部分参数来调用它,让它返回一个函数去处理剩余的参数;这个过程就称之为柯里化。
柯里化是一种函数的转换,将一个函数从可调用的f(a, b, c)转换为可调用的f(a)(b)(c),柯里化不会调用函数,它只是对函数进行转换。
2.柯里化的代码转换//没有进行柯里化的函数
function add1(x, y, z) {
return x + y + z
}
console.log(add1(10, 20, 30))
//柯里化处理的函数
function add2(x) {
return function(y) {
return function(z) {
return x + y + z
}
}
}
console.log(add2(10)(20)(30))
也可以使用箭头函数让代码更加简洁
var add3 = x => y => z =>{
return x + y + z
}
console.log(add3(10)(20)(30))
3.柯里化的优势
柯里化优势一:函数的职责单一
在函数式编程中,我们其实往往希望一个函数处理的问题尽可能的单一,而不是将一大堆的处理过程交给一个函数来处理;
那么我们是否就可以将每次传入的参数在单一的函数中进行处理,处理完后在下一个函数中再使用处理后的结果;
function add2(x) {
x = x + 2
return function(y) {
y = y * 2
return function(z) {
z = z ** 2
return x + y + z
}
}
}
传入的参数分别处理
第一个参数 + 2第二个参数 * 2第三个参数 ** 2柯里化优势二:函数的参数复用
function makeAdder(num) {
return function (count) {
return num + count
}
}
var add5 = makeAdder(5)
add5(12)
add5(100)
var add10 = makeAdder(10)
add10(12)
add10(100)
makeAdder函数要求我们传入一个num,在之后使用返回的函数时,我们不需要再继续传入num了
4.柯里化案例练习案例需要打印一些日志问题,包括时间、类型、信息;
function log(data, type, message) {
console.log(`[${date.getHours()}:${date.getMinutes()}] [${type}] [${message}]`)
}
log(new Date(), "DEBUG", "修复问题")
log(new Date(), "FEATURE", "新功能")
虽然可以实现,但是每次编写都需要复用许多代码,所以将其柯里化。
var log= data => type => message => {
console.log(`[${date.getHours()}:${date.getMinutes()}] [${type}] [${message}]`)
}
var logNow = log(new Date())
logNow("DEBUG")("轮播图bug")
logNow("DEBUG")("点击无效bug")
var logNowDebug = log(new Date())("DEBUG")
logNoewDebug("轮播图bug")
logNoewDebug("点解无效bug")
使用了箭头函数,简洁了一些,并且复用了许多代码。
5.柯里化高级-自动柯里化函数需要编写一个可以自动柯里化的函数
function Currying(fn) {
function curried(...args){
if(args.length >= fn.length){
return fn.apply(this, args)
}else {
return function (...args2){
return curried.apply(this, args.concat(args2))
}
}
}
return curried
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)