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

简介: 云栖号资讯:【点击查看更多行业资讯】在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 导读:什么是 OAM?2019 年 10 月 17 日,阿里巴巴合伙人、阿里云智能基础产品事业部总经理蒋江伟(花名:小邪)在 QCon 上海 2019 重磅宣布,阿里云与微软联合推出开放应用模型 Open Application Model (OAM)开源项目。

云栖号资讯:【点击查看更多行业资讯
在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来!


纯函数是所有函数式编程语言中使用的概念,这是一个非常重要的概念,因为它是函数式编程的基础,它允许你创建简单和复杂的组合模式。
纯函数背后的数学术语我就不说了,我直接说说说它们是什么以及它们的样子。

你可以确定满足以下条件的函数是纯函数:

  • 它应始终返回相同的值。不管调用该函数多少次,无论今天、明天还是将来某个时候调用它。
  • 自包含(不使用全局变量)。
  • 它不应修改程序的状态或引起副作用(修改全局变量)。

第一个条件:应始终返回相同的值

以以下功能为例

1

无论今天,明天还是将来某个时间调用 Math.cos(0)  都没关系,输出始终为1。我们来看一个新的例子

2

add函数也会发生同样的事情,不管调用该函数多少次或何时调用该函数,每次输出都相同。

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

3

如你所见,每次调用 Math.random() 时,输出都会改变,因此我们不能说 Math.random() 是纯函数。

第二标准:自包含

通过使用非纯函数,这个标准也很容易理解,所以让我们看看非纯函数是什么样子的:

4

从上一个示例可以看到,函数 addApplesToTotal 使用的是上面定义的变量,它不是传递 numberOfApples 的值,而是直接访问外部范围。因此,addApplesToTotal 不是自包含的。

第三个条件:它不应修改程序的状态或引起副作用

与前面的标准一样,可以使用非纯函数很好地演示这个标准。我们来看一下 👀

5

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

  • 它正在访问外部作用域,因此它不是自包含的。
  • 它正在引起副作用,因为它改变了 totalApples 的值。

为什么纯函数很重要?

  • 纯函数不那么复杂
  • 更容易调试 🐛
  • 易于组合
  • 易于并行化

总结

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

【云栖号在线课堂】每天都有产品技术专家分享!
课程地址:https://yqh.aliyun.com/live

立即加入社群,与专家面对面,及时了解课程最新动态!
【云栖号在线课堂 社群】https://c.tb.cn/F3.Z8gvnK

原文发布时间:2020-05-13
本文作者:杜尼卜
本文来自:“掘金”,了解相关信息可以关注“掘金”

相关文章
|
1天前
|
JavaScript 前端开发
在JavaScript中,函数原型(Function Prototype)是一个特殊的对象
JavaScript中的函数原型是一个特殊对象,它为所有函数实例提供共享的方法和属性。每个函数在创建时都有一个`prototype`属性,指向原型对象。利用原型,我们可以向所有实例添加方法和属性,实现继承。例如,我们定义一个`Person`函数,向其原型添加`greet`方法,然后创建实例`john`和`jane`,它们都能调用这个方法。尽管可以直接在原型上添加方法,但推荐在构造函数内部定义以封装数据和逻辑。
7 1
|
1天前
|
JavaScript 前端开发
JavaScript 的数组方法 map()、filter() 和 reduce() 提供了函数式编程处理元素的方式
【5月更文挑战第11天】JavaScript 的数组方法 map()、filter() 和 reduce() 提供了函数式编程处理元素的方式。map() 用于创建新数组,其中元素是原数组元素经过指定函数转换后的结果;filter() 则筛选出通过特定条件的元素生成新数组;reduce() 将数组元素累计为单一值。这三个方法使代码更简洁易读,例如:map() 可用于数组元素乘以 2,filter() 用于选取偶数,reduce() 计算数组元素之和。
7 1
|
3天前
|
前端开发 JavaScript 数据处理
在JavaScript中,异步函数是指什么
【5月更文挑战第9天】JavaScript中的异步函数用于处理非立即完成的操作,如定时器、网络请求等。它们可通过回调函数、Promise或async/await来实现。示例展示了如何使用async/await模拟网络请求:定义异步函数fetchData返回Promise,在另一异步函数processData中使用await等待结果并处理。当fetchData的Promise解析时,data变量接收结果并继续执行后续代码。注意,调用异步函数不会阻塞执行,而是会在适当时间点继续。
10 0
|
3天前
|
自然语言处理 JavaScript 前端开发
在JavaScript中,this关键字的行为可能会因函数的调用方式而异
【5月更文挑战第9天】JavaScript中的`this`关键字行为取决于函数调用方式。在非严格模式下,直接调用函数时`this`指全局对象,严格模式下为`undefined`。作为对象方法调用时,`this`指向该对象。用`new`调用构造函数时,`this`指向新实例。通过`call`、`apply`、`bind`可手动设置`this`值。在回调和事件处理中,`this`可能不直观,箭头函数和绑定方法可帮助管理`this`的行为。
10 1
|
3天前
|
JavaScript 前端开发 网络架构
JavaScript中的箭头函数是一种新的函数表达形式
【5月更文挑战第9天】JavaScript的箭头函数以简洁语法简化函数定义,其特性包括:1) 不绑定自身this,继承上下文的this,适合回调和事件处理;2) 没有arguments对象,需用剩余参数语法访问参数;3) 不能用作构造函数,无new调用;4) 没有prototype属性,不支持基于原型的继承。箭头函数在特定场景下优化了this处理,但使用时要注意与普通函数的差异。
7 2
|
5天前
|
JavaScript 前端开发
js的一些内置函数
js的一些内置函数
7 1
|
5天前
|
JavaScript 前端开发 索引
js的includes函数
js的includes函数
11 1
|
5天前
|
JavaScript 安全 前端开发
js的map函数
js的map函数
7 0
|
5天前
|
JavaScript 前端开发
js的filter函数
js的filter函数
9 1
|
5天前
|
JavaScript 前端开发
js的函数
js的函数
7 0