1.参数确定(累加参数确定)
如:
function sum(a,b,c,d){
return a+b+c+d
}
确定参数的函数柯里化实现
function sum(a,b,c,d){
return a+b+c+d
}
function curry(fn){
return function sum(...args){
if(args.length<fn.length){ // 判断接受的参数是否小于函数的参数长度
return function(){ // 参数不够长度,再次接受传递参数
return sum(...args,...arguments)
}
}
return fn(...args)// 不要求改变this,
}
}
let curried = curry(sum)
console.log(curried(1)(2)(3)(4))//10
console.log(curried(1,2)(2,4))//9
2.不确定参数实现sum(1)(2)(3)(4)(5)(6)...无限累加
未知参数个数,方法一
function curry(fn){
let parmas = []
return function sum(...args){
if(args.length){//判断是否有参数
parmas = [...parmas,...args]
return sum
}
return fn(parmas)
}
}
function add(arr){
return arr.reduce((acc,item)=>{
return acc+item
})
}
let curried = curry(add)
console.log(curried(1)(2)(3)(4)(10,20)())//40
// 注意最后的调用用方式,()调用不传递参数,会跳出判断,调用累加函数
未知参数个数,方法二
在方法内部定义一个tostring方法,返回计算的值
function curry(a){
function sum(b){
a=b?a+b:a
return sum
}
sum.toString=function(){
return a
}
return sum
}
console.log(curry(1)(2)(3)(10).toString()) // 注意,只能传递当个参数
// 最后必须调用toString方法,否则会返回一个匿名函数
方法二改进版,每次可传递多个参数
function curry(...args){
let parmas = args
function sum(){
parmas = [...parmas,...arguments]
return sum
}
sum.toString=function(){
return parmas.reduce((acc,item)=>{
return acc+item
})
}
return sum
}
console.log(curry(1)(2)(3)(10)(10,20).toString())
使用箭头函数会更简洁。
以上为个人学习总结,如有错误或者更好的实现,欢迎下方留言指正