函数式编程
纯函数
函数式编程有一个非常重要的概念叫纯函数,JavaScript符合函数式的范式,所以也有纯函数的概念
其中
react中组件就被要求像是一个纯函数(为什么是像,因为额外还有class组件)
什么是纯函数?(维基百科)
在程序设计中,若一个函数符合以下条件,那么这个函数被称为纯函数:
- 此函数在相同的输入时,需产生相同的输出
- 函数的输出和输入值以外的隐藏信息或状态无关,也和由I/O设备产生的外部输出无关
- 该函数不能有语义上可观察的函数副作用,诸如“触发事件”,使输出设备输出,或更改输出值意外的物件的内容等。
定义总结:
- 确定的输入,一定会产生确定的输出
- 在函数执行过程中,不能产生副作用
计算机科学中的
副作用概念表示在执行一个函数时,除了返回函数值意外,还对调用函数产生了附加的影响,比如修改了全局变量,修改参数或者改变外部的存储
“副作用往往是产生BUG的温床”
/*纯函数案例array.slice*/
柯里化(Currying)
什么是柯里化?(维基百科)
柯里化(Currying),又意为卡瑞化,加里化
把多个参数的函数,变成接收一个单一参数(最初函数的第一个参数)的函数,并且返回接收余下的参数,而且返回结果的新函数的技术
柯里化声称
“如果你固定某些参数,你将得到接收余下参数的一个函数”定义总结:
- 只传递给函数一部分参数来调用它,让它返回一个函数去处理剩余的参数
- 这个过程称之为柯里化
function sum1(x){return function(y){console.log(x+y);}};sum1(1)(2) // 3const sum2= x => y => console.log(x+y);sum2(1)(2) // 3
柯里化的优点
- 让函数的职责单一,每层函数仅处理一部分参数
- 提高逻辑的复用,对相同的参数可以多次调用
柯里化函数的实现
function hyCurrying(fn){function curried(...args){if(args.length>=fn.length){// 当已传入的参数 大于等于 需要的参数时,就执行函数return fn.apply(this,args);}else{// 没有达到个数时,就需要返回一个新的函数,继续来接收参数function curried2(...args2){return curried.apply(this,args.concat(args2));}return curried2;}}return curried;}
组合函数
组合函数是在JavaScript开发过程中一种对函数的使用技巧、模式
function hyCompose(...fns){var length=fns.length// 检测参数是否均为函数for(let i=0;i<length;i++){if(typeof fns[i]!=='function'){throw new TypeError('Expected arguments are functions');}}function compese(...args){var index=0;var result=length?fns[index].apply(this,args):args;while(++index<length){result=fns[index].call(this,result);}}return compese;}
