纯函数是函数式编程的基础,也是一个程序员所必备的基础知识,若你对纯函数还不是特别了解,那么一起来学习一下吧!一、纯函数的概念 纯函数是这样一种函数,即相同的输入,永远会得到相同的输出,而且没有任何可观察的副作用。
从纯函数的定义,可以提取出纯函数的必要条件:
- 相同的输入保证相同的输出(这个容易理解);
- 不会产生副作用(可查看如下内容:什么是副作用);
- 函数内部不会依赖和影响外部的任何变量。
副作用可能包含,但不限于:
- 更改文件系统
- 往数据库插入记录
- 发送一个 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 实用工具库,也是纯函数的代表。
推荐阅读
- 操作系统|[译]从内部了解现代浏览器(1)
- web网页模板|如此优秀的JS轮播图,写完老师都沉默了
- JavaScript|vue 基于axios封装request接口请求——request.js文件
- vue.js|vue中使用axios封装成request使用
- JavaScript|JavaScript: BOM对象 和 DOM 对象的增删改查
- JavaScript|JavaScript — 初识数组、数组字面量和方法、forEach、数组的遍历
- JavaScript|JavaScript — call()和apply()、Date对象、Math、包装类、字符串的方法
- JavaScript|JavaScript之DOM增删改查(重点)
- javascript|vue使用js-xlsx导出excel,可修改格子样式,例如背景颜色、字体大小、列宽等
- javascript|javascript中的数据类型转换