js函数式编程(一)-纯函数
我将写的第一个主题是js的函数式编程,这一系列都是mostly adequate guide这本书的读书总结。原书在gitbook上,有中文版。由于原作者性格活泼,书中夹杂很多俚语,并且行文洒脱。中文译版难免有时需要思量一番,既然读了就写出来,能方便别人最好,也请读者指正。正文如下。
如果一个函数是纯函数,那么其不依赖外部环境,并且不产生副作用。
- 1.不依赖外部环境,反例如下:
const a1 = 10;
const aFunc1 = () => {
// 依赖外部变量
return a1;
}
依赖外部环境的函数在运行时必须满足环境条件,如上,aFunc1在a1创建之前运行,就出错了。
2.不产生副作用。所谓副作用,是一切与外部交互的作用,比如console.log,IO,网络请求等。这些操作的结果是不可预计的,所以当包含副作用操作的函数执行后,结果是不可预计的。比如IO读写失败,网络出现问题,console.log通常没什么问题,但这仍然是外部的。举个片面的例子,在react里使用,就有可能因为打印某个在未来会被改变的状态,导致组件不必要的被刷新。
3.函数与外部的合法交互只能通过参数传递的方式。
那么为什么要用纯函数,纯函数和函数式编程有什么关系?
函数式编程,本质上是数学,它是数学现有理论在编程上的实现,在数学上,一个定理成立通常要满足一些数学条件,函数式编程也需要满足条件,这个条件就是函数必须是纯函数。
那么这是什么数学理论呢?
如上图,可以用一个函数表达式描述,即y = f(x),这是一种一一对应关系,输入x能得到唯一的结果y。也就是说x经过f的转换变成y,这个过程是稳定的,确定的,以此类推,y也可以经过某种确定的转换g,变成z,那么就具有如下等式:
\]
\]
\]
也就是说x经过w转换,可以变成z
某个状态经过多个函数转换成另一个状态,那么中间转换过程可以结合成一个转换,这大大的使问题简化,这是函数式编程带来的好处,而且只是一部分的好处,而这都基于纯函数。
### 如何看待副作用?
当然,我们知道,**很多时候无法避免使用副作用**。就如发送消息,必须经过网络。那是否函数式编程没有实际运用价值呢?当然不是。所有事情都不应该极端的理解,函数式编程的种种定理必须以纯函数作为根基,目的是写出健壮的,声明式的代码。可以利用函数式编程中如curry,functor,monad等奇巧淫记,将副作用加以限制并降到最低限度,保证代码的大部分是纯的。
js函数式编程(一)-纯函数的更多相关文章
- JavaScript函数式编程(纯函数、柯里化以及组合函数)
JavaScript函数式编程(纯函数.柯里化以及组合函数) 前言 函数式编程(Functional Programming),又称为泛函编程,是一种编程范式.早在很久以前就提出了函数式编程这个概念了 ...
- 从函数式编程到Ramda函数库(一)
函数式编程是种编程方式,它将电脑运算视为函数的计算.函数编程语言最重要的基础是λ演算(lambda calculus),而且λ演算的函数可以接受函数当作输入(参数)和输出(返回值).和指令式编程相比, ...
- JS函数式编程 - 概念
最近在看Typescript,顺便看了一些函数式编程,然后半个国庆假期就没有了.做个笔记,分几个部分写吧. 最开始接触函数式编程的时候,第一个接触的概念就是高阶函数,和柯里化.咋一看,这不就是长期用来 ...
- 【Python】[函数式编程]高阶函数,返回函数,装饰器,偏函数
函数式编程高阶函数 就是把函数作为参数的函数,这种抽象的编程方式就是函数式编程.--- - -跳过,不是很理解,汗 - ---
- 从函数式编程到Ramda函数库(二)
Ramda 基本的数据结构都是原生 JavaScript 对象,我们常用的集合是 JavaScript 的数组.Ramda 还保留了许多其他原生 JavaScript 特性,例如,函数是具有属性的对象 ...
- Python之路(第七篇)Python作用域、匿名函数、函数式编程、map函数、filter函数、reduce函数
一.作用域 return 可以返回任意值例子 def test1(): print("test1") def test(): print("test") ret ...
- 前端分享----JS异步编程+ES6箭头函数
前端分享----JS异步编程+ES6箭头函数 ##概述Javascript语言的执行环境是"单线程"(single thread).所谓"单线程",就是指一次只 ...
- python函数式编程之返回函数、匿名函数、装饰器、偏函数学习
python函数式编程之返回函数 高阶函数处理可以接受函数作为参数外,还可以把函数作为结果值返回. 函数作为返回值 def laxy_sum(*args): def sum(): ax = 0; fo ...
- Python之路Python作用域、匿名函数、函数式编程、map函数、filter函数、reduce函数
Python之路Python作用域.匿名函数.函数式编程.map函数.filter函数.reduce函数 一.作用域 return 可以返回任意值例子 def test1(): print(" ...
随机推荐
- uoj#37. 【清华集训2014】主旋律(状压dp+容斥)
传送门 第一眼容斥,然后我就死活容不出来了-- 记\(f_i\)为点集\(i\)中的点强联通的方案数,那么就是总的方案数减去使\(i\)不连通的方案数 如果\(i\)不连通的话,我们可以枚举缩点之后拓 ...
- 剑指OFFER之打印1到最大的N位数(九度OJ1515)
题目描述: 给定一个数字N,打印从1到最大的N位数. 输入: 每个输入文件仅包含一组测试样例.对于每个测试案例,输入一个数字N(1<=N<=5). 输出: 对应每个测试案例,依次打印从1到 ...
- 剑指Offer的学习笔记(C#篇)-- 反转链表
题目描述 输入一个链表,反转链表后,输出新链表的表头. 一 . 概念普及 关于线性表等相关概念请点击这里. 二 . 实现方法 目前,可以有两种方法实现该要求. 方法一:借助外部空间实现.这里可以将单链 ...
- Linux —— GDB调试程序
调试实现 在可执行文件中加入源代码的信息,比如可执行文件中第几条机器指令对应源代码的第几行,但并不是把整个源文件嵌入到可执行文件中,所以在调试时必须保证gdb能找到源文件. 生成可执行文件命令: g+ ...
- Web自动化测试—PO设计模式(二)
PO设计模式要点一:页面类都继承于BasePage 目录结构 ui_auto_test --src --pages --__init__.py --base_page.py --login_page. ...
- SpringBoot---核心---基本配置
1.[入口类和@SpringBootApplication注解] 2.[关闭特定的配置] 3.[定制Banner] 1.1 修改Banner 1.2 关闭Banner 4.SpringBoot配置文件
- kindeditor 修改上传图片的路径的方法
默认情况下kindeditor上传的图片在编辑器的根目录/attached/目录下.以日期建一个目录,然后保存文件.有些时候大概我们并不想这样.考虑到更新编辑器,或更换编辑器不太方便.比如我现在想把上 ...
- dao层写展示自己需要注意的问题
写dao层时一定要把 News news=new News(); 写在while循环内,是每循环一次,new出一个对象
- 前端js优化方案(二)持续更新
由于上篇篇幅过长,导致编辑出了问题,另开一篇文章继续: (4)减少迭代次数,最广为人知的一种限制循环迭代次数的模式被称为“达夫设备(Duff`s Device)” Duff`s Device的理念是: ...
- VMware虚拟机中red hat linux ping不通宿主物理主机原因
在VMware Workstation中安装了red hat enterprise linux系统,网络使用“桥接”形式,最后出现在Windows下能够Ping通虚拟主机,而虚拟主机Ping不通Win ...