函数式编程之纯函数
纯函数 我们应该还记得初中的一些数学知识,函数f的概念就是,对于输入x产生一个输出y=f(x),这就是普通的纯函数。它的定义是 相同的输入,结果总会得到相同的输出,而且没有任何可观察的副作用,也不依赖外部环境的状态。
最常见的一个例子就是在我们操作数组的时候slice就是纯函数,splice就是不纯的,看下面的例子
<script> var arr = [1,2,3,4,5,6] ; console.log(arr.slice(0,3))//1,2,3 console.log(arr.slice(0,3))//1,2,3这是纯函数相同输入总是得到相同的输出,可以这很函数式 console.log(arr.splice(0,3))//1,2,3 console.log(arr.splice(0,3))//4,5,6不纯的相同输入,不同输出 </script>
我们不希望splice,因为它会把原来数据弄得一团糟
不依赖外部状态 看看下面这个例子
var i = 20 ; function test(num) { if(num>i){//这里的行为是由外部环境决定的 将来会有很多不可预知的问题 //..dosomething }else { //..dosomething } } test(22) ; function test(num) { if(num>20){//虽然这里扩展性差但是,可以这很纯,不会因为外部环境改变而影响 //..dosomething }else { //..dosomething } } test(22) ;
这里我们可以用柯里化解决扩展性问题
function test(min) { return function(num) { if(num>min) { console.log('大于20') ; }else{ console.log('小于20') } } } var compare = test(20) ; compare(20) ;//大于20
柯里化就是先传递部分参数返回一个函数去处理剩下的参数(这里因为闭包对参数进行保存)