纯函数
说明:相同的输入永远会得到相同的输出,而且没有任何可观察的副作用。副作用让一个函数变的不纯,纯函数的根据相同的输入返回相同的输出,如果函数依赖于外部的状态就无法保证输出相同,就会带来副作用。
柯里化
说明:当一个函数有多个参数的时候先传递一部分参数调用它(这部分参数以后永远不变),然后返回一个新的函数接收剩余的参数,返回结果
lodash中的柯里化函数
_.curry(func)
功能:创建一个函数,该函数接收一个或多个 func 的参数,如果 func 所需要的参数都被提供则执行 func 并返回执行的结果。否则继续返回该函数并等待接收剩余的参数。
参数:需要柯里化的函数
返回值:柯里化后的函数
1 | const _ = require('lodash') |
1 | const _ = require('lodash') |
模拟 _.curry() 的实现
1 | function curry(func) { |
函数组合(compose)
说明:函数组合可以让我们把细粒度的函数重新组合生成一个新的函数。如果一个函数要经过多个函数处理才能得到最终值,这个时候可以把中间过程的函数合并成一个函数
注:函数组合默认是从右到左执行
1 | // 组合函数 |
lodash 中的组合函数
说明:lodash 中组合函数 flow() 或者 flowRight(),他们都可以组合多个函数
注:flow() 是从左到右运行,flowRight() 是从右到左运行,使用的更多一些
1 | const _ = require('lodash') |
模拟实现 lodash 的 flowRight 方法
1 | // 多函数组合 |
函数的组合要满足结合律 (associativity)
1 | // 结合律(associativity) |
调试组合函数
1 | const _ = require('lodash') |
lodash/fp
lodash 的 fp 模块提供了实用的对函数式编程友好的方法,提供了不可变 auto-curried iteratee-first data-last 的方法
1 | // lodash 模块 |
1 | const fp = require('lodash/fp') |