现代JS名词概念系列——函数的纯洁性【龟速翻译】
原文: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名词概念系列——函数的纯洁性【龟速翻译】相关推荐
- Nest.js 名词概念介绍
目录 1. 初识 Nest.js 1.1 什么是 Nest.js 1.2 Nest.js 优点 2. Nest.js 核心概念 2.1 控制器 Controller 2.2 提供者 Provider ...
- js基础--javascript基础概念之函数
js基础--javascript基础概念之函数 引用w3c介绍: 函数是由事件驱动的或者当它被调用时执行的可重复使用的代码块. JavaScript 函数语法 函数就是包裹在花括号中的代码块,前面使用 ...
- 线程模型、pthread 系列函数 和 简单多线程服务器端程序
一.线程有3种模型,分别是N:1用户线程模型,1:1核心线程模型和N:M混合线程模型,posix thread属于1:1模型. (一).N:1用户线程模型 "线程实现"建立在&qu ...
- php查询socket数据包头,php 查询数组值php中关于socket的系列函数总结
本文列举了所有关于PHP语言中使用socket相关服务的一些函数.注意使用如下函数之前,你需要确保你的socket已打开,如果你没有打开,请编辑你的php.ini文件,去掉下面这行前面的注释(分号): ...
- Tensorflow一些常用基本概念与函数
参考文献 Tensorflow一些常用基本概念与函数 http://www.cnblogs.com/wuzhitj/archive/2017/03.html Tensorflow笔记:常用函数说明: ...
- Tensorflow一些常用基本概念与函数(4)
摘要:本系列主要对tf的一些常用概念与方法进行描述.本文主要针对tensorflow的模型训练Training与测试Testing等相关函数进行讲解.为'Tensorflow一些常用基本概念与函数'系 ...
- 三维地图前端arcgis_【ArcGIS JS API + eCharts系列】实现二、三维网络路径图的绘制...
概述 前面两篇文章通过扩展EchartsLayer.js这个图层类,实现了使用ArcGIS JS API和eCharts,在二维和三维场景下绘制迁徙图和散点图.这篇文章继续通过绘制网络路径图的例子,再 ...
- Tensorflow一些常用基本概念与函数(2)
转载:http://blog.csdn.net/lenbow/article/details/52181159 摘要:本文主要对tf的一些常用概念与方法进行描述.为'Tensorflow一些常用基本概 ...
- arcgis api for js入门开发系列三地图工具栏(含源代码)
上一篇实现了demo的地图加载展示,在上篇实现的基础上,新增了地图工具栏以及通用地图控件功能,比如地图框选缩放.地图漫游.清空.量算工具.地图导航控件.地图比例尺控件.地图鹰眼图等等,总共分为5个部分 ...
- 04 【ArcGIS JS API + eCharts系列】实现二、三维网络路径图的绘制
概述 前面两篇文章通过扩展EchartsLayer.js这个图层类,实现了使用ArcGIS JS API和eCharts,在二维和三维场景下绘制迁徙图和散点图.这篇文章继续通过绘制网络路径图的例子,再 ...
最新文章
- 面试题:求最长非重复子序列
- python领域有什么用-Python都能应用到哪些领域?具体就业职位有什么?
- ASP.NET 2.0的页面缓存功能介绍
- NK.bin和NK.nb0学习
- DAO模式多表联查案例
- 【ArcGIS遇上Python】窗体版Python批量处理地理数据--栅格裁剪
- 文件I/O实践(3) --文件共享与fcntl
- 【题解】牛客小白月赛16(部分题,待补充……)
- 查看daemon使用技巧
- iOS开发之UITableViewController指定刷新cell 或section
- 对华为HG526无线猫做一下补充说明
- 订单系统管理系统 开源_8个开源销售点系统
- STVP烧录失败提示“cannot communicate with tool”或者“The device is protected”
- erpc的设计和工作机制
- 邮件助手工具哪个好用?哪个企业群发邮件的软件好用?
- element-ui校验表单只能输入数字
- Quectel EC20 获取 MCC,MNC,APN
- Macos 安装MacTex SublimeText3 Skim环境
- HC595驱动数码管
- 用Python将excel表格按照列拆分为多个表格