SOURCE

// 函数柯里化
// 核心实现是:通过闭包

var currySub = function (fn) {
    // 注意这个要保存后面的参数内容传给
    let args = Array.prototype.slice.call(arguments, 1);
    return function (...arg) {
        return fn.apply(null, args.concat(arg));
    }
};

function curry(fn, length) {
    // length限制输入的参数长度,没有则取函数的参数长度
    length = length || fn.length;

    return function(...arg) {
        if (arg.length < length) {
            const combin = [fn].concat(arg);
            return curry(currySub.apply(null, combin), length - arg.length);
        }
        return fn.apply(this, arg);
    }
}

function add(a, b, c) {
    return a + b + c;
}

var addCurry = curry(add);
// // addCurry() // 3
console.log(addCurry(1)(2)(3));

// var addCurry = curry(add, 1);
// console.log(addCurry(2)); // 3
//或者
// var addCurry = curry(add);
// console.log(addCurry(1, 2)) // 3

console 命令行工具 X clear

                    
>
console