纯函数是函数式编程的基础,也是一个程序员所必备的基础知识,若你对纯函数还不是特别了解,那么一起来学习一下吧!
一、纯函数的概念
纯函数是这样一种函数,即相同的输入,永远会得到相同的输出,而且没有任何可观察的副作用。
从纯函数的定义,可以提取出纯函数的必要条件:
- 相同的输入保证相同的输出(这个容易理解);
- 不会产生副作用(可查看如下内容:什么是副作用);
- 函数内部不会依赖和影响外部的任何变量。
什么是副作用
副作用是在计算结果的过程中,系统状态的一种变化,或者与外部世界进行的可观察的交互。
副作用可能包含,但不限于:
- 更改文件系统
- 往数据库插入记录
- 发送一个 http 请求
- 可变数据
- 打印/log
- 获取用户输入
- DOM 查询
- 访问系统状态
了解了纯函数的概念后,我们来看个示例:
// impure
var a = 10;
function add(b) {
return a + b;
}
上面这个示例不是纯函数,因为它依赖函数外部变量 a,若 a 发生了变化,它的返回值也会发生变化。若我们稍加修改,将 a 作为函数的一个入参,就是一个纯函数了。
// pure
function add(a + b) {
return a + b;
}
二、纯函数的优点
- 可缓存。结果可以被缓存,因为相同的输入总会获得相同的输出;
- 可测试。更加容易被测试,因为它们唯一的职责就是根据输入计算输出;
- 可多并发。多线程环境下并行操作共享的内存数据很可能会出现意外情况。纯函数不需要访问共享的内存数据,所以在并行环境下可以任意运行纯函数。(虽然JS是单线程,但是ES6以后有一个Web Worker,可以开启一个新线程)
- 没有副作用。纯函数不会修改作用域之外的状态,做到这一点,代码就变得足够简单和清晰:当你调用一个纯函数,你只要关注它的返回值,而不用担心因为别处的问题导致错误。
三、纯函数应用的某些案例
- 例如数组的一些基本方法: sort, map, filter, concat, slice, reduce 等都是纯函数。
- 相信很多小伙伴都使用过 Lodash,它是一个一致性、模块化、高性能的 JavaScript 实用工具库,也是纯函数的代表。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。