函数式编程之纯函数

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

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

posted @ 2016-12-02 11:58  Mrzwq  阅读(3421)  评论(1编辑  收藏  举报