javascript函数式编程在最近两年来频繁的出现在大众的视野,越来越多的框架(react,angular,vue等)标榜自己使用了函数式编程的特性,好像一旦跟函数式编程沾边,就很高大上一样,而且还有一些专门针对函数式编程的框架和库,比如:RxJS、cycleJS、ramdaJS、lodashJS、underscoreJS等。近年来随着技术的发展,函数式编程已经在实际生产中发挥巨大的作用了,越来越多的语言开始加入闭包,匿名函数等非常典型的函数式编程的特性,从某种程度上来讲,函数式编程正在逐步“同化”命令式编程。所以这里有必要介绍一下函数式编程的知识和特性。
二、纯函数(函数式编程的基石)
如果你还记得一些初中数学知识的话,函数f的定义就是,对于输入x产生一个输出y=f(x)。这便是一种最简单的纯函数。所以纯函数的定义是:即对于相同的输入,永远会得到相同的输出,而且没有任何可观察的副作用。
副作用可能包含,但不限于:
1.更改文件系统
2.往数据库插入记录
3.发送一个 http 请求
4.可变数据
5.打印/log
6.获取用户输入
7.DOM 查询
8.访问系统状态
下面举个栗子,比如在javascript中对数组的操作,有些是纯的,有些是不纯的:
var xs = [1,2,3,4,5]; // 纯的 xs.slice(0,3); //=> [1,2,3] xs.slice(0,3); //=> [1,2,3] xs.slice(0,3); //=> [1,2,3] // 不纯的 xs.splice(0,3); //=> [1,2,3] xs.splice(0,3); //=> [4,5] xs.splice(0,3); //=> []