📜  不纯函数 (1)

📅  最后修改于: 2023-12-03 15:21:31.984000             🧑  作者: Mango

不纯函数介绍

什么是纯函数?

纯函数是指在相同的输入条件下,总是返回相同的输出,不对外部环境产生副作用的函数。它们不会修改传入的参数,也不会改变全局状态。纯函数处理完输入后,返回一个新的值作为输出,而不是修改参数或全局变量的值。

纯函数有以下特点:

  • 相同的输入条件总是返回相同的输出结果。
  • 通过参数传递的值确定函数的行为。
  • 不会对外部环境产生副作用。

下面是一个简单的纯函数的例子:

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

以上的函数总是返回相同的输出结果,每次的输出值都仅仅由传入的参数决定,也不会对外部环境产生副作用。

不纯函数是什么?

与纯函数不同,不纯函数在相同的输入条件下可能会返回不同的输出结果,或者会对外部环境产生一定的副作用,例如修改全局状态或参数的值。下面是一个简单的不纯函数的例子:

let a = 5;

function increment() {
  a = a + 1;
  return a;
}

以上的函数每次执行时都会修改全局变量 a 的值,并且每次的输出结果也不同。

不纯函数的副作用

不纯函数会产生一些意想不到的副作用。让我们来看一个例子:

let users = [
  { name: 'Mike', age: 25 },
  { name: 'John', age: 30 },
  { name: 'Kate', age: 20 }
];

function deleteUser(name) {
  for (let i = 0; i < users.length; i++) {
    if (users[i].name === name) {
      users.splice(i, 1);
      return `${name} has been deleted!`;
    }
  }

  return `${name} not found!`;
}

以上的函数会删除全局变量 users 中的一个元素,并返回一个字符串。每次执行该函数时,都会破坏 users 数组的内容。

如何使用该函数的返回值判断数组是否被修改?如何回滚数据?这些都是不可避免的副作用。

不纯函数的应用场景

尽管不纯函数有许多缺点,但在某些情况下,它们是有用的,例如:

  • 与外部环境交互。例如,获取当前时间或检索数据。
  • 对全局状态进行修改。例如,缓存函数的输出或跟踪用户的历史记录。
总结

纯函数只处理传入参数的值,没有不可预期的副作用。相反,不纯函数可能返回不同的输出结果或修改全局状态。

在编写代码时,请尽可能使用纯函数,减少副作用的可能性,降低代码的复杂度和维护成本。