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

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

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

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

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);

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

 

 

 

你可能感兴趣的:(javascript)