SOURCE

// 柯里化旨在将多个参数分多次传入
// 获得实参个数,获得实参
// 返回一个匿名方法,他的返回函数要能拼接两次传入的参数
function curry(fn, args){
    let length = fn.length // 形参个数
    args = args || []  // 实参
    return function(){
        newArgs = args.concat(Array.prototype.slice.call(arguments))
        // console.log(Array.from(arguments).slice())
        // console.log(Array.prototype.slice.call(arguments))
        if(newArgs.length < length){
            return curry.call(this, fn, newArgs)
        }else{
            return fn.apply(this, newArgs)
        }
    }
}
function multiFn(a,b,c){
    return a * b * c
}
let multi = curry(multiFn)
console.log(multi(1)(2)(3))
multi(2)(3)(4);
multi(2,3,4);
multi(2)(3,4);
multi(2,3)(4)

// ES6柯里化写法
let curryES = (fn, arr = []) => (...args) => (
        arg => arg.length === fn.length
        ?
        fn(...arg)
        :
        curryES(fn,arg)
    )([...args,...arr]) 
let curryTest = curryES((a,b,c,d)=>a+b+c+d)
console.log(curryTest(1)(2)(3)(4))

console 命令行工具 X clear

                    
>
console