纯函数, 函数副作用和状态变化

2023-10-29
3分钟阅读时长

纯函数

纯函数是指没有副作用的函数。纯函数的特点是,在相同的输入下,总是返回相同的输出,并且没有修改任何外部状态或产生其他可观察到的副作用。这种函数一般被认为是更加可靠、可测试和可维护的。

下面是一些纯函数的特点和示例:

相同的输入产生相同的输出

纯函数的返回值仅由其参数决定,不受外部状态的影响。例如:

function add(a, b) {
  return a + b;
}

无论何时调用 add(2, 3),都会得到相同的结果 5。

没有副作用

纯函数不会修改传入的参数,也不会对全局变量进行修改。例如:

function double(arr) {
  return arr.map((num) => num * 2);
}

double 函数接受一个数组作为参数,并返回一个新的数组,其中每个元素都是原数组对应元素的两倍。原始数组本身保持不变。

不依赖于外部状态

纯函数只依赖于自己的输入参数,不依赖于外部的状态或数据。例如:

function greet(name) {
  return `Hello, ${name}!`;
}

greet 函数根据传入的 name 参数,返回相应的问候语。它不会依赖于任何全局变量或其他外部状态。

纯函数的好处

  • 可重用性:纯函数可以在不同的地方和不同的上下文中被重复使用,因为它们不依赖于任何特定的环境或外部状态。
  • 可测试性:由于纯函数的输出仅由输入决定,测试纯函数非常简单。通过提供不同的输入并验证输出,可以轻松编写针对纯函数的单元测试。
  • 可维护性:纯函数更容易理解和调试,因为它们的行为是可预测的,并且不会对其他代码产生意外影响。
  • 需要注意的是,并不是所有的函数都可以或应该是纯函数。有些函数可能需要修改外部状态或执行其他副作用以实现特定的功能。在编写代码时,需要根据实际需求权衡使用纯函数和非纯函数的比例。

函数副作用

函数的副作用是指函数除了返回一个值之外,还对其它东西(变量、数据结构等)做出了修改。也就是说,函数的副作用是指函数执行过程中对外部环境造成的影响。

以下是一些常见的函数副作用:

  • 修改全局变量:函数可以修改全局变量,这会对整个应用程序产生影响。这种情况下,函数会改变应用程序的状态,使得其他部分的行为可能不同于在没有调用该函数之前的行为。

  • 修改传递给函数的参数:函数可以修改传递给它的参数,这会对调用者的代码产生影响。如果函数修改了传递给它的参数,那么调用该函数的代码可能会以不同于预期的方式工作。

  • 改变对象状态:函数可以改变对象的状态。这意味着函数在执行期间可能会添加、删除或修改对象的属性和方法。如果函数返回对象,则调用方可能依赖于返回的对象属性的值。

  • 抛出异常:函数可以抛出异常,这可能会破坏代码的正常执行流程。调用方必须准备好处理异常,否则程序将终止。

状态变化

状态变化就是指代码执行过程中,数据的状态随时间而发生改变。状态可以分为内部状态和外部状态。内部状态只存在于函数的上下文中,外部状态则可能影响函数的执行结果。