相对于面向对象编程关注的是数据而言,函数式编程关注的是动作,是一种过程抽象的思维,就是对当前的动作去进行抽象。
函数式编程具有两个基本特征:
(1)函数是第一等公民;
(2)函数是纯函数
函数是第一等公民
指函数跟其他数据类型一样处于平等地位,可以赋值给其他变量,可以作为参数传入另一个函数,也可以作为别的函数的返回值。
纯函数
定义是对于相同的输入,永远会得到相同的输出,并且不会产生副作用的函数。无副作用指的是函数内部的操作不会对外部产生影响(如修改全局变量的值、修改DOM的值)
//是纯函数 function add(x,y){ return x+y; } //输出不确定,不是纯函数 function random(x){ return Math.random()*x; } //输出不确定,有副作用,不是纯函数 function setColor(el,color){ el.style.color=color; } //在js中,slice()是纯函数,每次传入相同的值返回同样的结果;splice()是不纯的。 //不纯的 var min = 18; var checkage = age => age > min; //纯的,这很函数式 var checkage = age => age > 18;
在不纯的版本中,函数的行为不仅取决于输入的参数,还可能取决于一个外部的变量,换句话说,这个函数的行为需要外部的系统环境决定。对于大型系统来说,对于这种外部状态的依赖是造成系统复杂性大大提高的主要原因。
函数式编程具有两个最基本的运算:合成和柯里化
函数合成是将代表各个动作的多个函数合并成一个函数。
函数柯里化是把接受多个参数的函数变成接受一个单一参数的函数,并且返回接收余下参数而且返回结果的新函数的技术。