原文: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

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

  1. Nest.js 名词概念介绍

    目录 1. 初识 Nest.js 1.1 什么是 Nest.js 1.2 Nest.js 优点 2. Nest.js 核心概念 2.1 控制器 Controller 2.2 提供者 Provider ...

  2. js基础--javascript基础概念之函数

    js基础--javascript基础概念之函数 引用w3c介绍: 函数是由事件驱动的或者当它被调用时执行的可重复使用的代码块. JavaScript 函数语法 函数就是包裹在花括号中的代码块,前面使用 ...

  3. 线程模型、pthread 系列函数 和 简单多线程服务器端程序

    一.线程有3种模型,分别是N:1用户线程模型,1:1核心线程模型和N:M混合线程模型,posix thread属于1:1模型. (一).N:1用户线程模型 "线程实现"建立在&qu ...

  4. php查询socket数据包头,php 查询数组值php中关于socket的系列函数总结

    本文列举了所有关于PHP语言中使用socket相关服务的一些函数.注意使用如下函数之前,你需要确保你的socket已打开,如果你没有打开,请编辑你的php.ini文件,去掉下面这行前面的注释(分号): ...

  5. Tensorflow一些常用基本概念与函数

    参考文献 Tensorflow一些常用基本概念与函数 http://www.cnblogs.com/wuzhitj/archive/2017/03.html Tensorflow笔记:常用函数说明: ...

  6. Tensorflow一些常用基本概念与函数(4)

    摘要:本系列主要对tf的一些常用概念与方法进行描述.本文主要针对tensorflow的模型训练Training与测试Testing等相关函数进行讲解.为'Tensorflow一些常用基本概念与函数'系 ...

  7. 三维地图前端arcgis_【ArcGIS JS API + eCharts系列】实现二、三维网络路径图的绘制...

    概述 前面两篇文章通过扩展EchartsLayer.js这个图层类,实现了使用ArcGIS JS API和eCharts,在二维和三维场景下绘制迁徙图和散点图.这篇文章继续通过绘制网络路径图的例子,再 ...

  8. Tensorflow一些常用基本概念与函数(2)

    转载:http://blog.csdn.net/lenbow/article/details/52181159 摘要:本文主要对tf的一些常用概念与方法进行描述.为'Tensorflow一些常用基本概 ...

  9. arcgis api for js入门开发系列三地图工具栏(含源代码)

    上一篇实现了demo的地图加载展示,在上篇实现的基础上,新增了地图工具栏以及通用地图控件功能,比如地图框选缩放.地图漫游.清空.量算工具.地图导航控件.地图比例尺控件.地图鹰眼图等等,总共分为5个部分 ...

  10. 04 【ArcGIS JS API + eCharts系列】实现二、三维网络路径图的绘制

    概述 前面两篇文章通过扩展EchartsLayer.js这个图层类,实现了使用ArcGIS JS API和eCharts,在二维和三维场景下绘制迁徙图和散点图.这篇文章继续通过绘制网络路径图的例子,再 ...

最新文章

  1. 面试题:求最长非重复子序列
  2. python领域有什么用-Python都能应用到哪些领域?具体就业职位有什么?
  3. ASP.NET 2.0的页面缓存功能介绍
  4. NK.bin和NK.nb0学习
  5. DAO模式多表联查案例
  6. 【ArcGIS遇上Python】窗体版Python批量处理地理数据--栅格裁剪
  7. 文件I/O实践(3) --文件共享与fcntl
  8. 【题解】牛客小白月赛16(部分题,待补充……)
  9. 查看daemon使用技巧
  10. iOS开发之UITableViewController指定刷新cell 或section
  11. 对华为HG526无线猫做一下补充说明
  12. 订单系统管理系统 开源_8个开源销售点系统
  13. STVP烧录失败提示“cannot communicate with tool”或者“The device is protected”
  14. erpc的设计和工作机制
  15. 邮件助手工具哪个好用?哪个企业群发邮件的软件好用?
  16. element-ui校验表单只能输入数字
  17. Quectel EC20 获取 MCC,MNC,APN
  18. Macos 安装MacTex SublimeText3 Skim环境
  19. HC595驱动数码管
  20. 用Python将excel表格按照列拆分为多个表格

热门文章

  1. c++之 推箱子小游戏
  2. 一劳永逸:服务器专用的软件防火墙
  3. 基数树结构---radix_tree
  4. 谷歌账号--手机号无法验证的问题
  5. 台湾大学林轩田机器学习技法课程学习笔记7 -- Blending and Bagging
  6. VulnHub渗透测试实战靶场 - SICKOS: 1.1
  7. Approaching (Almost) Any Machine Learning Problem
  8. Mac虚拟机Net模式设置
  9. c语言实现7段数码管显示,FPGA入门--七段数码管显示
  10. 2009个人年度总结报告