# 柯里化(Currying)

是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数, 并且返回接受余下的参数且返回结果的新函数的技术

// Array.prototype.slice.call(arguments) === [].slice.call(arguments) === [...arguments]
// []是不具备slice方法的,但是会沿着原型链一直往上找到Array,然后调用

function curry(fn, args) {
    var args = args || [];
    return function(){
        console.log([...arguments])
        newArgs = args.concat([...arguments])   // 这一步是收集参数
        // 如果收集的参数个数大于等于fn的参数个数执行fn,如果没有递归执行
        if (newArgs.length < fn.length) {
            // return curry.call(this,fn,newArgs);
        }else{
            // return fn.apply(this,newArgs);
            fn(newArgs)
        }
    }
}

var multiFn = (a, b, c) => a * b * c

var multi = curry(multiFn);

console.log(multi(2)(3)(4))
// console.log(multi(2,3,4))
// console.log(multi(2)(3,4))
// console.log(multi(2,3)(4))