学习链接
柯里化函数
柯里化是把一个多参数函数转化成一个嵌套的一元函数的过程
const curry = function(func) {return function curriedFn(...args) {if(args.length < func.length) { // 输入的参数数量暂未达到形参个数// console.log('func.length: ', func.length);// console.log('args.length: ', args.length);return function() {return curriedFn.call(this, ...args.concat([...arguments]));}}return func.call(this, ...args);}};const curry2 = function(func) {return function curriedFn(...args) {if(args.length === func.length) return func(...args);return (...rest) => curriedFn(...args, ...rest);}};
测试
const func = (a, b, c, d) => a * b * c * d;const test = curry(func);console.log('test(2)(3)(4)(5): ', test(2)(3)(4)(5));
组合函数、管道函数
组合函数 compose,目的是将多个函数组合成一个函数
compose 执行是从右到左的。而管道函数 pipe,执行顺序是从左到右执行的。
const compose = function(...args) {return function(val) {return args.reduceRight((arg, fun) => fun(arg), val);}};const pipe = function(...args) {return function(val) {return args.reduce((arg, fun) => fun(arg), val);}};// 箭头函数实现const compose2 = (...args) => val => args.reduceRight((arg, fun) => fun(arg), val);const pipe2 = (...args) => val => args.reduce((arg, fun) => fun(arg), val);
测试
const afn = a => a * 2;const bfn = b => b * 3;const cfn = c => c * 4;const func = compose(afn, bfn, cfn);console.log('func(2): ', func(2));
