2分钟了解什么是纯函数

纯函数是函数式编程的基础,也是一个程序员所必备的基础知识,若你对纯函数还不是特别了解,那么一起来学习一下吧!

一、纯函数的概念

纯函数是这样一种函数,即相同的输入,永远会得到相同的输出,而且没有任何可观察的副作用。

从纯函数的定义,可以提取出纯函数的必要条件:

  • 相同的输入保证相同的输出(这个容易理解);
  • 不会产生副作用(可查看如下内容:什么是副作用);
  • 函数内部不会依赖和影响外部的任何变量。
什么是副作用

副作用是在计算结果的过程中,系统状态的一种变化,或者与外部世界进行的可观察的交互。

副作用可能包含,但不限于:

  • 更改文件系统
  • 往数据库插入记录
  • 发送一个 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 实用工具库,也是纯函数的代表。

你可能感兴趣的