SOURCE

//核心考柯里化
//1.add()长度固定版//核心考柯里化
//1.add()长度固定版 。一次只能传一个参数时
function add(m){
    var temp=function(n){
        return add(m+n)
    }
    temp.toString=function(){
        return m
    }
    return temp
}
let n=add(1)(2)(3)(4)
console.log(n)//console.log会自动调用toString方法

//2.add()长度固定版 。一次不止传一个参数
function add1(a,b,c,d){
    return a+b+c+d
}
function curry(fn){
    let _this=this
    let args=[...arguments].slice(1)
    let oldargs=args
    return function temp() {
        args=args.concat(...arguments)
        if(args.length<fn.length){
            console.log(args.length)
            temp=fn.bind(_this,args)
            return temp
        }else{
            console.log(args)
            let val=fn.apply(_this,args)
            args=oldargs
            return val
        }
    }
}
let n1=curry(add1,2)
console.log(n1(1,3)()(4))
console.log(n1(5,6,7))

//3.add()长度不固定,一次不止传一个参数
function add2(){
    return [...arguments].reduce((pre,cur)=>pre+cur,0)
}
function curry2(fn){
    let args=[...arguments].slice(1)
    let _this=this
    let oldargs=args
    return function temp(){
        if([...arguments].length>0){
            args=args.concat(...arguments)
            temp=fn.bind(_this,args)
            return temp
        }else{
            let val=fn.apply(_this,args)
            args=oldargs
            return val
        }
    }
}
let n2=curry2(add2,3,4)
console.log(n2(1,2)(3)())
console.log(n2(8)())
console 命令行工具 X clear

                    
>
console