// fn(1) // fn(2) // fn(3) // fn(4) // fn(5) // fn() // console.log(1,2,3,4,5) function isFunction(fn) { return Object.prototype.toString.call(fn)=== '[object Function]'; } let fn = _curry(console.log,'test'); fn(1) fn(2) fn(3) fn(4) fn(5) fn() function _curry(fn){ let _arguments = Array.from(arguments); let params = _arguments.splice(1); return function(){ let __arguments = Array.from(arguments); if(__arguments.length >= 1){ params.push(...__arguments); }else{ return fn(...params,...arguments); } } } console.log('\n--------------------------------\n'); /** * @returns {(function(): (*))|*} */ function curry(){ let _arguments = Array.from(arguments); let runLength = null; let fn = null; let params = [..._arguments]; let cb = function (){ let __arguments = Array.from(arguments); params.push(...__arguments); // 本次函数的参数 // 历史函数的参数 // 参数数量是否至少两个. 一般需要三个 if(fn){ // 空值执行 if(__arguments.length<1 || (runLength && runLength <= params.length)){ return fn(...params); } return cb; } // console.log(params); // 从输入中提取要执行的函数 if(typeof params[0] === 'number' && isFunction(params[1])){ runLength = params[0]; fn = params[1]; params = params.splice(2); }else if(isFunction(params[0])){ runLength = null; fn = params[0]; params = params.splice(1); if(fn.length){ console.log(fn.length); runLength = fn.length; } }else if(typeof params[0] === 'number'){ runLength = params[0]; params = params.splice(1); }else{ throw {message:'first param must function or number'} } // console.log(params); if(fn){ if( runLength && runLength <= params.length){ console.log('?'); return fn(...params); } } return cb; } return cb; } function curry2(func) { return function curried(...args) { if (args.length >= func.length) { return func.apply(this, args); } else { return function(...args2) { return curried.apply(this, args.concat(args2)); } } }; } let c1 = function (event,msg){ console.log(`event:${event} say ${msg}`) } let c2 = function (f1,f2,f3,f4){ console.log(`1: ${f1}\n2: ${f2}\n3: ${f3}\n4: ${f4}`) } let c5 =function(){ console.log(...arguments); } let fn1 = curry(c1,'test'); let r1 = fn1('你好1'); let r1_2 = fn1('你好2'); let r1_3 = fn1('你好3'); console.log('--------'); let fn2 = curry(4); let r2 = fn2(c2)('a','b')('c','d'); console.log('--------'); let fn3 = curry(4,c2,'fn3 1','fn3 2'); let r3 = fn3('tes')('你好','9999999'); console.log('--------'); let fn4 = curry(2,console.log); let r4 = fn4('fn4'); console.log('--------'); let fn5 = curry(c5); let r5 = fn5('text555')('你好---')(); console.log('--------');