SOURCE

function add (...args) {
    return args.reduce((pre,cur) => pre + cur)
}
function add_fixed_numbers (a, b, c) {
    return a + b + c
} 
// 固定参数
function currying_fixed_arguments (func, ...args) {
    return func.length <= args.length ? 
    func.call(null, ...args) : currying.bind(null, func, ...args)
}

// 不固定参数
// addCur(1)(2)() = 3
function currying_not_fixed_arguments (func) {
    const args = []
    return function inner(...argsInner) {
        if (argsInner.length) {
            args.push(...argsInner)
            return inner
        } else {
            const ret = func.apply(null, args)
            args.length = 0
            return ret
        }
    }
}

const addCurried = currying_not_fixed_arguments(add)
console.log(addCurried(1)(2,3,4)())

console 命令行工具 X clear

                    
>
console