什么是纯函数,JavaScript函数式编程的基础

纯函数是所有函数式编程言语中运用的概念,这是一个非常重要的概念,由于它是函数式编程的根底,它答应你创立简单和杂乱的组合形式。

纯函数背面的数学术语我就不说了,我直接说说说它们是什么以及它们的样子。

你可以确定满足以下7 E c ^ 5条件的函数是纯函数:

  • 它应一直回来相同的值。不论调用该函数多少次,无论今日、明日仍是将来某个时分调用它。
  • 自包括(不运用全局变量)。
  • 它不该修正程序的状态或引起副效果(修正全局变量)。

第一个条件:应一直回来相同的值

以以下功能为例

Math.cosf e , 5 8 ^  g /(0) // 1

无论今日,明日仍3 % x R是将来某个时间调用 Math.cos(0) 都没联系,输出一直为1。咱们来看一个新的例子

const numberOfApples = 5;
const applesBought = 5;
const add = (nuW { Z G ( 1m1, num2) => num1 + num2;
const totalApples = add(numbet . a K X K { 9 WrOfApples, applesBought) // 10
const totalApples = add(numberOfApples, aR i H T , N o r FpplesBought) // 10
// ... one month later* h m
const totalApples = add(numberOfApples, applesBoughtm m v v) //10

add函数也会发生同p Z 2 r _ e 样的事情,不论调用该函数多少次或c l ) : 7 g ? e何时调用该函数,每次输出都相同。

现在,咱们来看一个随时间或每次调用而9 Q p变化的函数:

Math.random() // 回来一个随机数j * V { . % U `
Math.random() // 回来一个不同的随机数
// 一个月Y H b ] 1 , P i #
Mai N } : 0th.random() // 回来一个不同的随机数

如你x 2 G x所见,每次调用 Math.randoR l 6m() 时,输出都会改变,因而咱们不能说 Math.random() 是纯函数。

第二F m X 8 h ` . =规范:自包括

经过运用非纯函数,这个规范也很简单了解,所以让咱们看看非纯函数是什么样子G D 9的:

const numberOfApples = 5
const applesBought = 5
const addApplesToTotal = (num1) => numberOfApples + num1;
conX d g m 6 U @ st totalAppF * $ 3 6 K Sles = addApplesToTotal(applesBought); // 10

从上一个示例可k , g M R o } Y c以看到,函数 addApplesToTotal 运用的是上面界说的变量,它不是传递 numberOfApples 的值,而是直接拜访外部规模。因而,addApplesToTotal 不是自包括的。

第三个条件:它不该修正程序的状态或引起副效果

与前面的规范一样,可以运用非纯函数很好地演示这个规范。咱们来看一下

let totai 3 u / / { l 9lApples = 5
const applesBought = 5
const aR [ O L / K rddApplesToTotal = (b C u E # J R V G) => {
totalApples += applesBought
};
addApplesToTotal()

你能从前面的不纯函数中注意到什么?它打破了前面的两个规范!!

  • 它正在拜访外部效果域,因w K m P , 5而它不是O t Z .自包括的。
  • 它正在引起副效果,由于它改变了 totalApples 的值。

为什么纯函数很重要?

  • % w B @ ] – ;函数不那么杂乱
  • x ; C k l [简单调试
  • 易于组合
  • 易于并行化

总结

纯函数是函数编程中一个基本但功能强大的概念。学习和习惯纯函数可以使你更轻松地测试和调试代码。它们将答应你学习关于函数式编程的更杂乱的知识。


来源:levelup.gitconnected.com,作者:Guillermo Martnez Espina

发表评论

提供最优质的资源集合

立即查看 了解详情