纯函数
概念:相同的输入永远会得到相同的输出,而且没有任何可观察的副作用。
纯函数就类似数学中的函数(用来描述输入和输出之间的关系),y=f(x)
loadsh 是一个纯函数的功能库,提供了对数组,数字,对象,字符串,函数等操作的一些方法
纯函数的好处是:
可缓存
副作用:
让一个函数变得不纯,如果函数依赖于外部的状态就无法保证输出相同,就会带来副作用。
例:
let min = 18;
function getIsAge(age) {
return age <= min
}
这时候如果外部的min 有所变化 那么这个函数返回的结果就不同。
副作用的来源:
- 配置文件
- 数据库
- 获取用户输入
- ....
副作用不可能完全禁止,但是要尽可能把它们控制在可控范围内。
柯里化
使用柯里化解决硬编码的问题
// 硬编码案例
function getIsAge(age) {
let min = 18;
return age <= min
}
// 解决方案 普通的纯函数
function getIsAge(min, age ) {
return age <= min
}
// 函数的柯里化
function getIsAge(min) {
return function(age) {
return age <= min
}
}
当一个函数有多个参数的时候 可以先传递一部分参数调用它(这部分参数以后永远不变)
然后返回一个新的函数接收剩余的参数,返回结果。
loadsh 的柯里化方法
_.curry(func)
function getSum (a,b,c) {
return a+b+c
}
const curried = _.curry(getSum)
console.log(curried(1,2,3))
柯里化总结:
柯里化可以让我们给一个函数传递较少的参数得到一个已经记住了某些固定参数的新函数。
这是一种对函数参数的缓存。
让函数变得更灵活,让函数的粒度最小
可以把多元函数转换成一元函数,可以组合使用函数产生强大的功能。
函数组合
如果一个函数要经过多个函数处理才能得到最终值,这个时候可以把中间过程的函数合并成一个函数
函数就像是数据管道,函数组合就是把这些管道连接起来,让数据穿过多个管道形成最终结果
函数组合默认是从右到左执行
//函数组合演示
function compose(f, g) {
return function (value) {
return f(g(value))
}
}
function reverse(array) {
return array.reverse()
}
function first(array) {
return array[0]
}
const last = compose(first, reverse)
console.log(last([1,2,3,4]))
loadsh 中的组合函数
flow(),flowRight()