纯函数与非纯函数 | 青训营笔记

91 阅读2分钟

这是我参与「第四届青训营」笔记创作活动的第3天,通过如何写好javascript这门课程,我了解到了一个新的概念:纯函数与非纯函数。

首先,来了解一下什么是纯函数与非纯函数

纯函数

  1. 可维护性高,无副作用(即改变函数外部的状态)
  2. 纯函数不依赖于程序执行期间函数外部任何状态或数据的变化,并且必须只依赖于其输入的参数
  3. 输出的结果是可预期的,即输入输出是确定的,当我们输入相同的值时,纯函数的输出结果总是相同的
function add(a, b){
    return a + b;
}
console.log(add(1, 3))//4

不难看出,上面代码的执行结果一定为4,无论我们输入多少次1和3,其输出结果都为4,并且在函数执行的过程中只依赖于其输入的参数,因此如上代码即可成为纯函数。

非纯函数

  1. 可维护性差,有副作用
  2. 输出的结果是不可预期的,当我们输入相同的值时,非纯函数的输出结果可能会不相同
function add(a, b){
    return a + b + Math.round(Math.random() * 10);
}
console.log(add(1, 3));

当我们输入多次1和3时,每次的输出结果不一定相等,即其输出结果是不可预期的,因此,该函数是非纯函数。

再来看看下面的例子

let idx = 0;
function count(){
    return ++idx;
}
count();
count();
count();

上面的代码,该函数在执行的过程中依赖于外部变量idx,并且每次调用该函数都会修改外部变量idx的值,因此该函数为非纯函数。

总结

  1. 在开发中我们应该多使用纯函数,可以提高我们代码的可维护性和代码的质量
  2. 非纯函数的测试难度和成本要比纯函数高
  3. 高阶函数一般都是纯函数,使用高阶函数,可以大大减少我们使用非纯函数的可能性