什么是纯函数_以及为什么要用纯函数?

更新日期: 2018-11-07阅读量: 17119标签: 函数

当我第一次听到 “纯函数 (Pure Function)” 这个术语的时候我很疑惑。常规的函数做错了什么?为什么要变纯? 为什么我需要纯的函数?

除非你已经知道什么是纯函数,否则你可能会问同样的疑惑。不过这个概念其实很简单。我们可以花个 5 分钟一起来看以下。


什么函数是纯的?

纯函数的定义是:

  1. 如果函数的调用参数相同,则永远返回相同的结果。它不依赖于程序执行期间函数外部任何状态或数据的变化,必须只依赖于其输入参数。

  2. 该函数不会产生任何可观察的副作用,例如网络请求,输入和输出设备或数据突变(mutation)。

这就是纯的函数。 如果一个函数符合上述 2 个要求,它就是纯函数。 你可能在过去甚至无意地情况下编写过纯函数。

在我们研究一个函数一个纯或不纯之前,让我们先讨论一下可怕的“副作用”。


什么是可观察的副作用?

一个可以被观察的副作用是在函数内部与其外部的任意交互。这可能是在函数内修改外部的变量,或者在函数里调用另外一个函数等。

注: 如果纯函数调用纯函数,则不产生副作用依旧是纯函数。

副作用来自,但不限于:

  • 进行一个 HTTP 请求

  • Mutating data

  • 输出数据到屏幕或者控制台

  • DOM 查询/操作

  • Math.random()

  • 获取的当前时间

副作用本身并不是毒药,某些时候往往是必需的。 但是,对于要保持纯粹的函数,它不能包含任何副作用。当然,并非所有函数都需要是纯函数。 我将在稍后讨论这个情况。

不过首先,让我们来看一些纯的和不纯的函数对比的例子......


纯函数的例子

以下是一个计算产品税后价格(英国税率是20%)的纯函数的例子:

function priceAfterTax(productPrice) { return (productPrice * 0.20) + productPrice;}

它符合我们所说的两条纯函数的定义。不依赖于任何外部输入,不改变任何外部数据、没有副作用。

即使你用同样的输入运行运行这个函数 100,000,000 次它依旧产生同样的结果


非纯函数

我们已经看了纯函数的例子,现在一起来看一个非纯函数(Impure function)的 JavaScript 例子:

var tax = 20;
function calculateTax(productPrice) {
    return (productPrice * (tax/100)) + productPrice;
}

暂停片刻,看看你是否能看出为什么这个函数不纯。

其中函数的计算结果取决于外部 tax 变量,而纯函数不能依赖外部变量。它没有满足定义中的第一个要求,因此这个函数是不纯的。


为什么说纯函数在 JavaScript 很重要?

纯函数在函数式编程中被大量使用。而且诸如 ReactJS 和 Redux 等优质的库都需要使用纯函数。

不过,纯函数也可以用在平常的 JavaScript 开发中使用,不一定要限死在某个编程范例中。 你可以混合纯的和不纯的函数,这完全没问题。

并非所有函数都需要是纯的。 例如,操作 DOM 的按钮按下的事件处理程序就不适合纯函数。 不过,这种事件处理函数可以调用其他纯函数来处理,以此减少项目中不纯函数的数量。


可测试性和重构

另一个使用纯函数的原因是测试以及重构。

使用纯函数的一个主要好处是它们可以直接测。 如果传入相同的参数,它们将始终产生相同的结果。

同时纯函数还使得维护和重构代码变得更加容易。你可以放心地重构一个纯函数,不必操心没注意到的副作用搞乱了整个应用而导致终调试地狱。(译注:如果项目中充斥着副作用,那么函数/模块之间的逻辑可能互相交织耦合,在后期新增逻辑时可能由于依赖复杂而难以重构,更常见的是开发为了应付需求而不断的引入新的副作用到原本的逻辑上从而导致代码变得越来越糟糕。)

正确地使用纯函数可以产生更加高质量的代码。并且也是一种更加干净的编码方式。

此外,纯函数不不是 JavaScript 的专利。想要了解更多内容可以参见 Wiki。同时也推荐阅读 开发建议手册 以及 纯函数 vs. 非纯函数.

原文链接: medium.com 
翻译来源:https://www.zcfy.cc/article/javascript-what-are-pure-functions-and-why-use-them 


站长推荐

1.云服务推荐: 国内主流云服务商,各类云产品的最新活动,优惠券领取。地址:阿里云腾讯云华为云

链接: https://www.fly63.com/article/detial/1274

Js中的函数使用方法

什么是函数,就是把一段相对独立的具有特定功能的代码块封装起来,形成一个独立实体,就是函数,起个名字(函数名),在开发中可以反复调用,函数的作用就是封装一段代码,可以重复使用。

JS如何重写一个函数?

分享一些自己在开发上遇到的问题,比如我们页面上用了大量的打印语句,但是在某些时候,我们不想要了。我们删除这里的代码,如果太多了,那工作量太大好累,想想都不想干

js如何简短优雅地实现sleep函数?

sleep函数作用是让线程休眠,等到指定时间在重新唤起。那么在js中如何优雅的来实现呢?

javascript构造函数

提起构造函数,我们需要从JS的创建对象开始,JS的创建对象有两种方式,一种是对象字面量法(把一个对象的属性和方法一一罗列出来),对象字面量法有一个明显的不足在于它不适合批量的或者是构建大量的类似或者重复的对象

初识云函数

什么是云函数?云函数提供了一种直接在云上运行,无状态的、短暂的、由事件触发的代码的能力,云函数与轻服务的关系:云函数,就是FaaS模式的具体实现。同样,对象存储、数据库应用、缓存服务等,是BaaS模式的具体实现。对于轻服务,BaaS和FaaS缺一不可

JS 高阶函数

什么是函数?在大多数编程语言中,函数是一段独立的代码块,用来抽象处理某些通用功能的方法;主要操作是给函数传入特定对象(参数),并在方法调用结束后获得一个新的对象

Js箭头函数和lambda

es6中的箭头函数,在实际开发中确实比较方便,通常来说会有几个特点:箭头函数中的this会绑定在外部作用域;没有arguments;如果想返回一个对象记得加()包裹;call和apply不能传入this

编写小而美函数的艺术

随着软件应用的复杂度不断上升,为了确保应用稳定且易拓展,代码质量就变的越来越重要。不幸的是,包括我在内的几乎每个开发者在职业生涯中都会面对质量很差的代码。这些代码通常有以下特征:

CSS的var()函数怎么用?

CSS中的var()函数可用于插入自定义属性(有时称为“css变量”)的值,而不是插入其他属性值的任何部分。随着sass,less预编译的流行,css也随即推出了变量定义var函数。var()函数,就如同sass和less等预编译软件一样,可以定义变量并且进行对应的使用。

CSS之calc()

calc() 函数支持任意CSS长度单位的混合计算,遵循标准数学运算优先级规则,可以动态计算长度值。注意,calc()函数内部的运算符两侧各加一个空白符,否则会产生解析错误。calc()使用的难点在于百分比

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!