123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130 |
- // 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('--------');
|