SOURCE

console 命令行工具 X clear

                    
>
console
 function currying(fn,len){
        //捕获函数需要传入 len 个函数后才可执行
        //第一次调用获取函数 fn 参数的长度,后续调用获取 fn 剩余参数的长度
        var len = len || fn.length;
        return function(){
            //判断新函数接收的参数长度是否大于等于 fn 剩余参数需要接收的长度
            if( arguments.length >= len ){
            //参数一致则执行函数
                return fn.apply(this,arguments)
            }else{
            //不满足参数个数则递归 currying 函数传入 fn.bind() => 传入部分参数的新函数,并且重新定义新函数所需的参数个数 
                return currying(fn.bind(this,...arguments),len - arguments.length)
            }
        }
    }

var test = currying(function(a,b,c){
    return a + b + c;
});

console.log(test(1)()(2,3)); // 6
console.log(test()(1,2)(3)); // 6
console.log(test(1)(2)(3));  // 6

function sum(){
    //将参数转化出数组
    var args = [].slice.call(arguments);
    
    function add(){
        args.push(...arguments)
        return add;
    }
    add.toString = function (){
        if(!args.length){
            return 0;
        }
        return args.reduce(function(a,b){
            return a + b;
        })
    }
    
    return add;
}
console.log(sum(1,2)(3) == 6) //true
console.log(sum(1,2)(3)(4) == 10) //true
console.log(sum(1)(2)(3)(4)(5) == 15) //true