纯函数学习 (一)什么是纯函数
1.前言:
纯函数的定义是这样的:
纯函数是这样一种函数,即相同的输入,永远会得到相同的输出,而且没有任何可观察的副作用。
所以我们可以看出纯函数的定义:
相同输入必定能得出相同输出。
函数执行过程中没有任何副作用。
下面让我们来围绕这两点来学习纯函数。
2.辨认纯函数
纯函数和非纯函数的辨认是很难的,写的时候我们就会会出现疑惑导致出现错误,这里我将举个例子来说明它们间的区别
/**
* 下面例子是个正例(Positive ),
* 我们可以看出slice函数输入相同的情况下输出必定相同,
* 而且并不会对array造成影响(内部元素并不会变化)并且也不会对其他环境造成可预见的影响,
* 所以我们可以说slice是纯函数
**/
let array = [0,1,2,3,4];
array.slice(0,3);//[0,1,2]
array.slice(0,3);//[0,1,2]
console.log(array);//[0,1,2,3,4]
/**
* 下面例子是个反例(negative),
* 可以看见纵使输入相同输出是不定的,
* 并且函数修改了原始数组(副作用),
* 这是个完美的非纯函数
**/
let array2 = [0,1,2,3,4];
array.splice(0,3);//[0,1,2]
array.splice(0,3);//[3,4]
console.log(array);//[]
从上面的例子就能很容易看出所谓副作用
就是:
在计算结果的过程中,系统状态的一种变化,或者与外部世界进行的可观察的交互
副作用可能包含,但不限于:
- 更改文件系统
- 往数据库插入记录
- 发送一个 http 请求
- 可变数据
- 打印/log
- 获取用户输入
- DOM 查询
- 访问系统状态
副作用让一个函数变得不纯是有道理的:从定义上来说,
纯函数必须要能够根据相同的输入返回相同的输出
;如果函数需要跟外部事物打交道,那么就无法保证这一点了。
3.结语
以上就是纯函数的定义阐述,从这里的初步了解我们可以看出纯函数是个非常特殊的“工具”,自带“不动”和“避世”属性,这就让纯函数有很多独特的特性,明天我将带大家学习为什么要使用纯函数。