函数式编程概念
副作用
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函数可以依赖全局变量。
函数式编程的实现:仅依赖输入就可以完成自身逻辑的函数,以保证获得可缓存、可测试的代码。
函数式编程定义的重要特性
-
引用透明性
var indentity = i => { return i };引用透明性/不可变性:所有函数对于相同的输入返回相同的值。 这样的好处在于它不依赖全局数据,可以多线程运行代码(而不必同步)和缓存已经运算的结果(函数以相同参数再调用时,直接返回已计算的值)。 即:
sum(4, 5) + indentity(1);等效于
sum(4, 5) + 1这可以缓存代码、 附:引用透明性也是一种哲学。 心得:函数式就是要将所有可能会变化的因素全部包含到函数中。
-
声明式与抽象 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