函数式编程之纯函数

时间:2021-07-19 22:39:46

纯函数 我们应该还记得初中的一些数学知识,函数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

柯里化就是先传递部分参数返回一个函数去处理剩下的参数(这里因为闭包对参数进行保存)