函数柯里化实现sum(1)(2)(3)(4)...无限累加

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())

使用箭头函数会更简洁。

以上为个人学习总结,如有错误或者更好的实现,欢迎下方留言指正

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值