资讯专栏INFORMATION COLUMN

现代JS名词概念系列——函数的纯洁性【龟速翻译】

you_De / 648人阅读

摘要:原文函数的纯洁性纯函数非纯函数副作用纯函数一个函数返回的值只取决于他输入的值,并且没有副作用,那这个函数就是纯函数。因此,纯函数无法对它的父作用域作出任何修改。更多关于函数纯洁性的资料

原文:Glossary of Modern JavaScript Concepts: Part 1

函数的纯洁性:纯函数、非纯函数、副作用 纯函数

一个函数返回的值只取决于他输入的值,并且没有副作用,那这个函数就是纯函数。这样的函数只要参数是一样的,返回的结果就永远只有一个。以下是一个例子:

function half(x) {
  return x / 2;
}

half(x)函数接受x作为参数,返回x值的一半。如果传入8,那么返回的一定是4.调用一个纯函数时,它的结果可以完全代替这个纯函数,例如我们可以用4代替half(8),无论在哪里使用都不会改变这段代码的最终结果,这就是纯函数的引用透明性
纯函数只依赖它的参数。例如纯函数不能引用它父作用域的变量(除非这个变量作为参数传入)。因此,纯函数无法对它的父作用域作出任何修改。

// some variable that is mutated
let someNum = 8;

// this is NOT a pure function
function impureHalf() {
  return someNum / 2;
}

总结:

纯函数必定带参数

输入一样,输出必定一样

纯函数只改变内部状态不改变外部状态

纯函数无副作用

纯函数不能调用非纯函数

非纯函数

非纯函数会改变它作用域外面的状态(state)。很多有副作用的函数都是非纯函数。

// 非纯函数产生副作用
function showAlert() {
  alert("This is a side effect!");
}

// 非纯函数改变外部变量
var globalVal = 1;
function incrementGlobalVal(x) {
  globalVal += x;
}

// 一个装纯的非纯函数
// 他每次返回的值都不同
function getRandomRange(min, max) {
  return Math.random() * (max - min) + min;
}
JavaScript里的副作用

当函数或表达式修改自己上下文以外的属性,就是产生了副作用。副作用包括调用API、操作DOM、调用alert、数据库操作等。如果一个函数产生副作用,那么他就是非纯的。产生副作用的函数会改变外部变量,因此让人捉摸不透,难以测试。

关于纯洁性的总结

很多高质量代码由调用纯函数的非纯函数组成。这依然在测试和不变性上很有优势。有引用透明性那么就可以写成记忆函数:储存函数结果,然后重用之前储存的结果。这可以判断这个函数是否是纯函数。
更多关于函数纯洁性的资料

Pure versus impure functions

Master the JavaScript Interview: What is a Pure Function?

Functional Programming: Pure Functions

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/88626.html

相关文章

  • 翻译】塑造成功框架哲学

    摘要:我将描述我发现塑造成功框架的一些哲学。根据我的框架开发经验,我特此冷凝和总结我认为任何成功的框架最重要的哲学。现代框架往往是松散耦合的体系结构。全栈框架例如已经演变成由松散耦合的组件可以单独使用或与第三方交换的框架。 来源:Philosophies that Shaped Successful Frameworks 在过去的十年里我们看到了许多软件框架的出现,像 Spring 和 Ru...

    kgbook 评论0 收藏0
  • 前端每周清单第 10 期:Firefox53、React VR发布、Microsoft Edge现代

    摘要:新闻热点国内国外,前端最新动态发布近日,正式发布新版本中提供了一系列的特性与问题修复。而近日正式发布,其能够帮助开发者快速构建应用。 前端每周清单第 10 期:Firefox53、React VR发布、JS测试技术概述、Microsoft Edge现代DOM树构建及性能之道 为InfoQ中文站特供稿件,首发地址为这里;如需转载,请与InfoQ中文站联系。从属于笔者的 Web 前端入门...

    MingjunYang 评论0 收藏0
  • 简单易懂ECMA规范导读1 that's this

    摘要:本文不是标准的中文翻译,也不是的入门教程,本文虽然以的常见问题切入,但并不适合想要快速了解这些问题的人才是快速了解问题的正解。尽量以英文原版为基础,为了流畅,可能会使用某些名词的中文翻译,但会将匹配的英文名词以此种样式中出现一次以避免误解。 简单易懂的ECMA规范导读1 序 最近混SF,恰巧又逢工作方面有了NodeJS的机会,迫切地有教别人怎么写JS的需求, 我发现JS这个东西其实...

    yintaolaowanzi 评论0 收藏0
  • JavaScript系列(四) - 收藏集 - 掘金

    摘要:函数式编程前端掘金引言面向对象编程一直以来都是中的主导范式。函数式编程是一种强调减少对程序外部状态产生改变的方式。 JavaScript 函数式编程 - 前端 - 掘金引言 面向对象编程一直以来都是JavaScript中的主导范式。JavaScript作为一门多范式编程语言,然而,近几年,函数式编程越来越多得受到开发者的青睐。函数式编程是一种强调减少对程序外部状态产生改变的方式。因此,...

    cfanr 评论0 收藏0
  • 前端小知识--TypeSript和JavaScript到底是什么关系?

    摘要:想学好前端,真的要主动,然后对所有的英文文档耐心一点。在年月日,国际组织发布了的第六版,该版本正式名称为,但通常被称为或者。自此,每年发布一次新标准。但保留了用于依赖注入的构造函数参数类型。必须在构造函数中声明属性,而不是在类的代码体中。 从 TypeScript 到 ES6 到 ES5 在我初学前端的很长一段时间,不愿意碰git,不愿意碰框架,总是嫌麻烦,连ES6也没有怎么去弄明白...

    sixleaves 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<