学习链接

面试官:说说你对函数式编程的理解?优缺点?

「前端进阶」彻底弄懂函数组合

「前端进阶」彻底弄懂函数柯里化

柯里化函数

柯里化是把一个多参数函数转化成一个嵌套的一元函数的过程

  1. const curry = function(func) {
  2. return function curriedFn(...args) {
  3. if(args.length < func.length) { // 输入的参数数量暂未达到形参个数
  4. // console.log('func.length: ', func.length);
  5. // console.log('args.length: ', args.length);
  6. return function() {
  7. return curriedFn.call(this, ...args.concat([...arguments]));
  8. }
  9. }
  10. return func.call(this, ...args);
  11. }
  12. };
  13. const curry2 = function(func) {
  14. return function curriedFn(...args) {
  15. if(args.length === func.length) return func(...args);
  16. return (...rest) => curriedFn(...args, ...rest);
  17. }
  18. };

测试

  1. const func = (a, b, c, d) => a * b * c * d;
  2. const test = curry(func);
  3. console.log('test(2)(3)(4)(5): ', test(2)(3)(4)(5));

组合函数、管道函数

组合函数 compose,目的是将多个函数组合成一个函数

compose 执行是从右到左的。而管道函数 pipe,执行顺序是从左到右执行的。

  1. const compose = function(...args) {
  2. return function(val) {
  3. return args.reduceRight((arg, fun) => fun(arg), val);
  4. }
  5. };
  6. const pipe = function(...args) {
  7. return function(val) {
  8. return args.reduce((arg, fun) => fun(arg), val);
  9. }
  10. };
  11. // 箭头函数实现
  12. const compose2 = (...args) => val => args.reduceRight((arg, fun) => fun(arg), val);
  13. const pipe2 = (...args) => val => args.reduce((arg, fun) => fun(arg), val);

测试

  1. const afn = a => a * 2;
  2. const bfn = b => b * 3;
  3. const cfn = c => c * 4;
  4. const func = compose(afn, bfn, cfn);
  5. console.log('func(2): ', func(2));