函数式编程

纯函数

函数式编程有一个非常重要的概念叫纯函数,JavaScript符合函数式的范式,所以也有纯函数的概念

其中react中组件就被要求像是一个纯函数(为什么是像,因为额外还有class组件)

什么是纯函数?(维基百科)

在程序设计中,若一个函数符合以下条件,那么这个函数被称为纯函数:

  1. 此函数在相同的输入时,需产生相同的输出
  2. 函数的输出和输入值以外的隐藏信息或状态无关,也和由I/O设备产生的外部输出无关
  3. 该函数不能有语义上可观察的函数副作用,诸如“触发事件”,使输出设备输出,或更改输出值意外的物件的内容等。

定义总结:

  • 确定的输入,一定会产生确定的输出
  • 在函数执行过程中,不能产生副作用

计算机科学中的副作用概念

表示在执行一个函数时,除了返回函数值意外,还对调用函数产生了附加的影响,比如修改了全局变量,修改参数或者改变外部的存储

“副作用往往是产生BUG的温床”

  1. /*
  2. 纯函数案例
  3. array.slice
  4. */

柯里化(Currying)

什么是柯里化?(维基百科)

柯里化(Currying),又意为卡瑞化,加里化

把多个参数的函数,变成接收一个单一参数(最初函数的第一个参数)的函数,并且返回接收余下的参数,而且返回结果的新函数的技术

柯里化声称“如果你固定某些参数,你将得到接收余下参数的一个函数”

定义总结:

  • 只传递给函数一部分参数来调用它,让它返回一个函数去处理剩余的参数
  • 这个过程称之为柯里化
  1. function sum1(x){
  2. return function(y){
  3. console.log(x+y);
  4. }
  5. };
  6. sum1(1)(2) // 3
  7. const sum2= x => y => console.log(x+y);
  8. sum2(1)(2) // 3

柯里化的优点

  • 让函数的职责单一,每层函数仅处理一部分参数
  • 提高逻辑的复用,对相同的参数可以多次调用

柯里化函数的实现

  1. function hyCurrying(fn){
  2. function curried(...args){
  3. if(args.length>=fn.length){
  4. // 当已传入的参数 大于等于 需要的参数时,就执行函数
  5. return fn.apply(this,args);
  6. }else{
  7. // 没有达到个数时,就需要返回一个新的函数,继续来接收参数
  8. function curried2(...args2){
  9. return curried.apply(this,args.concat(args2));
  10. }
  11. return curried2;
  12. }
  13. }
  14. return curried;
  15. }

组合函数

组合函数是在JavaScript开发过程中一种对函数的使用技巧、模式

  1. function hyCompose(...fns){
  2. var length=fns.length
  3. // 检测参数是否均为函数
  4. for(let i=0;i<length;i++){
  5. if(typeof fns[i]!=='function'){
  6. throw new TypeError('Expected arguments are functions');
  7. }
  8. }
  9. function compese(...args){
  10. var index=0;
  11. var result=length?fns[index].apply(this,args):args;
  12. while(++index<length){
  13. result=fns[index].call(this,result);
  14. }
  15. }
  16. return compese;
  17. }