函数柯里化
函数柯里化 是将多个参数的函数转换为一系列接受单个参数的函数的过程,举例来说,就是能把 add(a,b,d) 转变为 add(a)(b)(d),这个过程利用了闭包,即内部函数能够使用外部函数的变量
原函数
function add(a,b,c){
return a+b+c;
}
// 调用时
console.log(add(1,2,3)) // 6
柯里化后
function Curried1(a){
return function(b){
return function(c){
return a+b+c;
}
}
}
// 调用
console.log(Curried1(1)(2)(3)) // 6
也可简写为箭头函数
const Curried2=(a)=>(b)=>(c)=>a+b+c;
// 调用
console.log(Curried2(1)(2)(3)) // 6
优点
- 单一职责原则
柯里化后每个函数都有各自的职责,方便后续维护和修改工作
// 普通函数:
// 这只是简单的运算,如果a、b、c的值有十分复杂的变化,会难以修改
function sum(a,b,c){
a=a*2;
b=b/3;
c=c*c;
return a+b+c;
}
// 柯里化后:
// 柯里化后每个函数都有单一职责,不易混乱
function sum(a){
a=a*2;
return function(b){
b=b/2;
return function(c){
c=c*c;
}
}
}
- 逻辑复用
在某些运算中,可能只需要修改传入参数中的其中一个,其他不变,这种情况下,为了实现更好的复用,可以写为柯里化函数
// 普通函数:
function sum1(a,b){
return a+b;
}
// 计算 1+3、1+5、1+9
console.log(sum1(1,3)) // 4
console.log(sum1(1,5)) // 6
console.log(sum1(1,9)) // 10
// 柯里化后:
function sum2(a){
return function(b){
return a+b;
}
}
// 可以用一个变量存储 sum2(1),然后再传入其他参数,结果一致
let aa=sum2(1)
console.log(aa(3)) // 4
console.log(aa(5)) // 6
console.log(aa(9)) // 10
最后
柯里化函数可用于延迟执行,如同上述代码,调用后存储到一个变量,需要时再调用传参
核心在于:函数里面返回函数,能方便维护代码,减少冗余