1

2分钟了解什么是纯函数

 2 years ago
source link: https://segmentfault.com/a/1190000041214971
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

2分钟了解什么是纯函数

发布于 1 月 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 实用工具库,也是纯函数的代表。

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK