SOURCE

// // function currying(fn,...args){
// //     if(fn.length <= args.length){
// //         return fn(...args)
// //     }
// //     return function(...args1){
// //         return currying(fn,...args,...args1)
// //     }
// // }
// // function add(a,b,c){
// //     return a + b + c //fn.length =3
// // }
// // add(1,2,3) // 6
// // var curryingAdd = currying(add);
// // let num = curryingAdd(1)(2)(3) // 6
// // console.log(num)



// function add (...args) {
//     // return args.reduce((a, b) => a + b)
//     return args.reduce((a, b) => a + ' ' + b)
// }

// function currying (fn) {
//     let args = []
//     return function _c (...newArgs) {
//         if (newArgs.length) {
//             args = [
//                 ...args,
//                 ...newArgs
//             ]
//             return _c
//         } else {
//             return fn.apply(this, args)
//         }
//     }
// }
// let addCurry = currying(add)
// // 注意调用方式的变化
// console.log(addCurry('Hello')('World')())

// // //简化
// function functionFunction(str) {
//     console.log(str,arguments)
//     var ret = Array.prototype.slice.call(arguments).join(', ');
//     console.log(ret)
//     var temp = function(str) {
//          console.log(str)
//         ret = [ret, Array.prototype.slice.call(arguments).join(', ')].join(', ');
//          console.log(ret)
//         return ret;
//     };
//     console.log(temp,111)
//     temp.toString = function(){
//         console.log(ret)
//         return ret;
//     };
//     return temp;
// }
// let a = functionFunction('Hello')('World')('Hello')('World').toString();
// console.log('end',a)

// 定长参数
	function add (a, b, c, d) {
		return [
		  ...arguments
		].reduce((a, b) => a + b)
	}
	function currying (fn) {
		let len = fn.length
		let args = []
		return function _c (...newArgs) {
			// 合并参数
			args = [
				...args,
				...newArgs
			]
			// 判断当前参数集合args的长度是否 < 目标函数fn的需求参数长度
			if (args.length < len) {
				// 继续返回函数
				return _c
			} else {
				// 返回执行结果
				return fn.apply(this, args.slice(0, len))
			}
		}
	}
	let addCurry = currying(add)
    console.log(addCurry(1)(2, 3)(4))
	// let total = addCurry(1)(2)(3)(4) // 同时支持addCurry(1)(2, 3)(4)该方式调用
	// console.log(total) // 10


    Function.prototype.uncurrying = function() {
    var that = this;
    return function() {
        return Function.prototype.call.apply(that, arguments);
    }
    };
    
    function sayHi () {
    return "Hello " + this.value +" "+[].slice.call(arguments);
    }
    let sayHiuncurrying=sayHi.uncurrying();
    console.log(sayHiuncurrying({value:'world'},"hahaha"));
console 命令行工具 X clear

                    
>
console