SOURCE

// function curry(fn){
//     return function cruuied(...args){
//         if(args.length >= fn.length){
//             return fn.apply(this,args)
//         } else {
//             return function (...args2){
//                 return cruuied.apply(this,args.concat(args2))
//             }
//         }
//     }
// }





// function curry(fn) {
//     //2.获取curry的参数列表,没有fn
//     var args = Array.prototype.slice.call(arguments, 1);
//     return function() {
//         //3.获取接下来传入的参数
//         var nextArgs = Array.prototype.slice.call(arguments);
//         //4.将两次获取的参数合并成一个数组
//         var finalArgs = args.concat(nextArgs);
//         //5.判断传入的参数个数是否到达要求函数需要传入个数
//         if(finalArgs.length < fn.length) {
//             //6.没有达到要求继续返回柯里化函数
//             return curry(fn, ...finalArgs);
//         }
//         //7.利用apply将数组参数传入进去,返回调用函数的返回值
//         return fn.apply(null, finalArgs);
//     }
// }

function curry(fn,...args){
  return (...callbackArgs)=>{
    const currentArgs = [...args,...callbackArgs]
    
    return fn.length === currentArgs.length  ?  fn(...currentArgs) : curry(fn,...currentArgs);
  }
}

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

function once(){
  console.log('run once')
}

let curriedSum = curry(sum,10);

// console.log( curriedSum(1, 2, 3) ); // 6,仍然可以被正常调用
// console.log( curriedSum(2,3)); // 6,对第一个参数的柯里化
// console.log( curriedSum(1)(2)) ; // 6,全柯里化
console.log(curry(once)())
console.log( curriedSum(1)(1))
console 命令行工具 X clear

                    
>
console