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

原创 2018年04月16日 16:55:25
函数组合应用:由若干个纯函数、偏函数、柯里化函数组合成一个新的函数,同时,形成数据传递。

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

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

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

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



js 函数式编程 浅谈

js 函数式编程 函数式的思想, 就是不断地用已有函数, 来组合出新的函数。 函数式编程具有五个鲜明的特点: 1. 函数是"第一等公民" 指的是函数与其他数据类型一样,处于平等地位 2. 只用"...
  • u011700203
  • u011700203
  • 2015-08-01 22:16:48
  • 3057

JavaScript 函数式编程到底是个啥

随着大前端时代的到来,在产品开发过程中,前端所占业务比重越来越大、交互越来越重。传统的老夫拿起JQuery就是一把梭应付当下重交互页面已经十分乏力。于是乎有了Angular,React,Vue这些现代...
  • hj7jay
  • hj7jay
  • 2017-06-22 10:15:04
  • 883

JavaScript-可维护代码编写,函数式编程与纯函数

JavaScript-可维护代码编写,函数式编程与纯函数JavaScript是函数式编程与面向对象编程的混合编程语言,加上本身一些可扩展性(比如:函数参数个数及类型的不确定),使得JavaScript...
  • qiqingjin
  • qiqingjin
  • 2016-05-26 21:02:59
  • 1500

JS函数式编程基础(FP)

函数式编程 纯函数 柯里化 函数合成
  • sgm222
  • sgm222
  • 2017-04-09 17:40:09
  • 372

JavaScript中函数式编程的体现--map和reduce

这两个函数都在某种程度上体现了函数式编程的思想,即将函数作为传入另一个函数的参数。map()方法的调用者一般是个数组,参数是一个函数,称为callback,返回值是一个由原数组中每个元素执行给定cal...
  • Pwiling
  • Pwiling
  • 2016-07-08 13:09:08
  • 2184

翻译连载 | JavaScript轻量级函数式编程-第4章:组合函数 |《你不知道的JS》姊妹篇

原文地址:Functional-Light-JS 原文作者:Kyle Simpson-《You-Dont-Know-JS》作者 关于译者:这是一个流淌着沪江血液的纯粹工程:认真,是 HTML 最坚实...
  • lszy16
  • lszy16
  • 2017-09-12 10:01:47
  • 473

你有必要知道的函数式编程

原文:http://www.ruanyifeng.com/blog/2017/02/fp-tutorial.html 你可能听说过函数式编程(Functional programmi...
  • zdhsoft
  • zdhsoft
  • 2017-04-19 11:31:58
  • 796

JavaScript 轻量级函数式编程

  • 2017年11月03日 19:11
  • 598KB
  • 下载

编写高质量代码:改善JavaScript程序建议--函数式编程

函数式编程已经在实际应用中经发挥了巨大作用,更有越来越多的语言不断地加入对诸如闭包、匿名函数等的支持,从某种程度上来讲,函数式编程正在逐步同化命令式编程。 建议1:禁用Function构造函数使用Fu...
  • ligang2585116
  • ligang2585116
  • 2016-10-16 21:19:24
  • 1813

函数式编程 常用类库

基本类型和装箱类型的转换由于Java的泛型都是基于对泛型类型的擦除,所以泛型的参数只能是基本类型对应的装箱类型。由于装箱类型是对象,因此在内存中存在额外开销。在Java 8 中,仅对 整型 长整型 双...
  • Thousa_Ho
  • Thousa_Ho
  • 2017-05-04 10:07:31
  • 265
收藏助手
不良信息举报
您举报文章:JS函数式编程--函数组合应用
举报原因:
原因补充:

(最多只允许输入30个字)