欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JS函数式编程--函数组合应用

程序员文章站 2024-03-03 16:23:04
...

函数组合应用:由若干个纯函数、偏函数、柯里化函数组合成一个新的函数,同时,形成数据传递。

挑选了一系列所需要的函数,把他们组合在一起,可以实现公共合作的效果。

先来,直观感受一下函数组合:

function compose(f, g){
  return function(x){
    return f(g(x));   //自右向左依次执行,称为左倾,使得x自右向左传递
  }
}

接着来看:

//先写两个纯函数【不了解什么是纯函数的可以搜索博主关于纯函数的博客进行学习】
function toUpperCase(str){
  return str.toUpperCase();
}
function add(str){
  return str + '!';
}
var f = compose(toUpperCase, add);
f('Hello'); //HELLO!

但是compose不具有普遍意义,现在我们来写一个具有普遍意义的组合函数:

function compose() {
  var args = Array.prototype.slice.call(arguments),//将arguments类数组变成数组
      len = args.length - 1; 
  return function(x){
    var result = args[len](x);
    while(len--){
      result = args[len](result);
    }
    return result;
  }
}
//再写3个纯函数
function split(arr){
  return arr.split('');
}
function reverse(arr){
  return arr.reverse();
}
function join(arr){
  return arr.join('-');
}

//执行
//输入'time' ==> 'E-M-I-T!' 
//过程:time => TIME => T,I,M,E => E,M,I,T => E-M-I-T => E-M-I-T!
var f1 = compose(add, join, reverse, split, toUpperCase);
f1('time'); // E-M-I-T!

 

因为需要把上一次执行结果当作参数传给下一次执行,因此可以使用reduce进行优化:

 

function compose(){
  var args = [].slice.call(arguments);
  return function(x) {
    return args.reduceRight(function(res, cb){
      return cb(res);
    }, x);
  }
}

es6写法:

const compose = (...args) => x => args.reduceRight((res, cb) => cb(res), x);

自左向右同理处理,通常称为“通道”。