ES8函数式编程

103 阅读2分钟

函数式编程概念

副作用

i=3 //运算i=3,副作用是i变成了3
var xs = [1,2,3,4,5,6];
// 可以,这很函数式
xs.slice(0,3);
//=> [1,2,3]
// 这不函数式
xs.splice(0,3);
//=> [1,2,3]

函数式编程组成

只有表达式。 纯表达式没有任何副作用,只返回结果,而纯语句只有副作用,常使程序行为难以预测,是函数式编程思想所要避免的。

什么是数学函数,什么是js函数?

数学函数是不依赖外部环境的函数,而js函数可以依赖全局变量。

函数式编程的实现:仅依赖输入就可以完成自身逻辑的函数,以保证获得可缓存、可测试的代码。

函数式编程定义的重要特性

  1. 引用透明性

    var indentity = i => { return i };
    

    引用透明性/不可变性:所有函数对于相同的输入返回相同的值。 这样的好处在于它不依赖全局数据,可以多线程运行代码(而不必同步)和缓存已经运算的结果(函数以相同参数再调用时,直接返回已计算的值)。 即:

    sum(4, 5) + indentity(1);
    

    等效于

    sum(4, 5) + 1
    

    这可以缓存代码、 附:引用透明性也是一种哲学。 心得:函数式就是要将所有可能会变化的因素全部包含到函数中。

  2. 声明式与抽象 for循环是命令式编程,forEach循环是声明式编程。

纯函数的定义

如何避免副作用?—— 函数柯里化

函数柯里(curry)化: 传递给函数一部分参数来调用它,让它返回一个函数去处理剩下的参数。

比如对于加法函数 var add = (x, y) => x + y ,我们可以这样进行柯里化:

//比较容易读懂的ES5写法
var add = function(x){
    return function(y){
        return x + y
    }
}

//ES6写法,也是比较正统的函数式写法
var add = x => (y => x + y);

//试试看
var add2 = add(2);
var add200 = add(200);

add2(2); // =>4
add200(50); // =>250