函数式编程1

概念

函数式编程是一种思想,一种编程范式,需要多写才能体会。

特性

纯函数

相同的输入 肯定得到相同的输出 不依赖外部状态

var arr = [ 1, 2, 3, 4, 5 ]
arr.slice( 0, 3 ) //[0,1,2]
arr.slice( 0, 3 ) //[0,1,2]
var arr1 = [ 1, 2, 3, 4, 5 ]
arr1.push( 1 ); //6   push方法 向数组末尾添加一个元素,并返回新的长度
arr1.push( 1 ); //7
//slice 方法 相同的输入总是得到相同的输出  是纯函数  相反 push不是纯函数

柯里化

传递给函数比部分参数调用他 返回值去处理剩下的参数,每次只能输入一个参数

//柯里化  刚开始传递一部分参数调用函数(checkage(18))  然后让其在返回一个新的函数(checkage18)去处理剩下的参数(checkage18(20))  
var cheakage = min => ( age => age => min )
var checkage = function ( min ) {
    return function ( age ) {
        return min > age;
    }
}
var checkage18 = checkage( 18 ); //产生了闭包 实质
checkage18( 20 ) //返回值 false

函数组合

一个值经过多个函数编程另外一个值 可以把中间的函数合并为一个函数 解决函数嵌套的问题

///函数组合  柯里化 每次传入一个参数  当参数越来越多 里面嵌套函数 越来越多. 解决函数嵌套的问题
var compose  = function(f,g){
    return function(x){
        f(g(x))
    }
}

惰性求值

function getName(){
    var a = 1;
    console.log(22)
    getName = function(){
        console.log(2222)
        return a;
    }
    return a;
}
console.log(getName)//1
console.log(getName)//1
//具体请看js的执行过程

高阶函数

函数当做参数 把传入的函数作为一个封装,然后返回封装函数 达到更高层次的抽象

function add(a,b){
    return a+b;
}

function sum(add,array){
    return add(array[0],array[1]);
}

sum(add,[1,2])

尾调用优化

递归需要保存大量的调用记录,容易发生栈溢出错误,尾递归将递归变为循环只需要保存一个调用记录,不会发生溢出内存的错误。
具体作用优点可以参考阮一峰es6 函数拓展

//尾调用优化  最为显著的是尾递归

function factorial(n,total){
    if(n===1) {
        return n+total

    }else {
        return factorial(n-1,n+total);
    }
}
console.log(factorial(5,0));

闭包

函数式编程几乎都涉及闭包,函数在自身定义所在的作用域位置以外执行就形成闭包。

你可能感兴趣的:(函数式编程1)