柯里化函数
1. 柯里化函数
有多个形参的函数转换成多个只有一个形参的函数
f(a,b,c) -> fn(a)
fn1(b)
fn2(c)
f(a,b,c) -> fn(a)(b)(c)
function sum(a,b){
return a + b
}
// let s = sum(10,20)
// console.log(s)
/*
sum进行柯里化转换 -> f(10)(20) <=> sum(10,20)
let f = curryingSum(sum)
*/
function curryingSum(sum){
return function(a){ //接收第一个参数
return function(b){ //接收第二个参数
return sum(a,b) //两个参数融入sum中计算进行返回
}
}
}
let f = curryingSum(sum)
let s = f(10)(20)
console.log('s ',s)
2.可以实现参数的复用
function sum(a,b){
return a + b
}
function curryingSum(sum){
return function(a){ //接收第一个参数
return function(b){ //接收第二个参数
return sum(a,b) //两个参数融入sum中计算进行返回
}
}
}
let f = curryingSum(sum) //柯里化函数sum
let s = f(10) //复用第一个参数10
let k = s(20)
let g = s(50)
console.log('k ',k,'g',g) //30 60
1.参数复用的好处:
1.我们在封装一个函数时,如果我们确定前几部的操作该到哪里,那我们可以进行柯里化确定的操作 避免一些重复的操作
3.通用的封装方法 我们可以一次传入多个值 还可以多次操作 提高了程序复用性
function currying(func) {
return function curried(...args) { //展开参数 可以一次传多个参数 暂时第一次传的参数
if (args.length >= func.length) { //判断传入参数是否 全部获取
return func.apply(this,args)
// return func(...args) //这两个写法是一样的效果
} else {
return function (...arg2) { //展开参数 可以一次传多个参数 暂时第二次传的参数
let arg = [...args, ...arg2] //合并参数
return curried.apply(this, arg) 全部传入curried方法返回
}
}
}
}