函数式编程是一种编程范式,和面向对象是并列关系(编程范式:思想+实现方式)
- 面向对象编程:对现实世界中的事物的抽象,抽象出对象以及对象和对象之间的关系
- 函数式编程:把现实世界的事物和事物之间的联系抽象到程序世界(对运算过程的抽象)
- 纯函数:
- 函数在相同的输入,始终输出相同,函数的输出和输入值以外的其它隐藏信息或状态无关,由I/0设备产生的外部输出无关。
- 该函数不能有语义上可观察的副作用。比如触发事件等。(如果参数是引用传递,对参数的更改会影像函数以外的数据,不是纯函数)
柯里化
- 函数降维,利用闭包。将多元函数变为一元函数,多个细粒度的 进行函数组合 成新函数去使用,利于重用。
- 应用:
- 固定不常用的参数
- vue.js源码中使用
- src/platform/web/patch.js
- 延迟执行(模拟bind方法)
Function.prototype.myBind = function(context,...args){
return (...rest)=>this.call(context,...args,...rest)
}
函数组合
- 库 lodash/fp fp.flowRight()
- 函子
- 控制副作用(IO),异常处理(Either),异步任务(Task)
- 库 folktale
//简单的函子示例
class Functor{
static of(value){
return new Functor(value)
}
constructor(value){
this._value = vlaue
}
map(f){
return f(this._value)
}
}