我将写的第一个主题是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,那么就具有如下等式:

\[y = f(x) = 2x
\]

\[z = g(y) = y + 1
\]

\[z = g(f(x)) = w(x) = 2x + 1
\]

也就是说x经过w转换,可以变成z

某个状态经过多个函数转换成另一个状态,那么中间转换过程可以结合成一个转换,这大大的使问题简化,这是函数式编程带来的好处,而且只是一部分的好处,而这都基于纯函数。

### 如何看待副作用?

当然,我们知道,**很多时候无法避免使用副作用**。就如发送消息,必须经过网络。那是否函数式编程没有实际运用价值呢?当然不是。所有事情都不应该极端的理解,函数式编程的种种定理必须以纯函数作为根基,目的是写出健壮的,声明式的代码。可以利用函数式编程中如curry,functor,monad等奇巧淫记,将副作用加以限制并降到最低限度,保证代码的大部分是纯的。

js函数式编程(一)-纯函数的更多相关文章

  1. JavaScript函数式编程(纯函数、柯里化以及组合函数)

    JavaScript函数式编程(纯函数.柯里化以及组合函数) 前言 函数式编程(Functional Programming),又称为泛函编程,是一种编程范式.早在很久以前就提出了函数式编程这个概念了 ...

  2. 从函数式编程到Ramda函数库(一)

    函数式编程是种编程方式,它将电脑运算视为函数的计算.函数编程语言最重要的基础是λ演算(lambda calculus),而且λ演算的函数可以接受函数当作输入(参数)和输出(返回值).和指令式编程相比, ...

  3. JS函数式编程 - 概念

    最近在看Typescript,顺便看了一些函数式编程,然后半个国庆假期就没有了.做个笔记,分几个部分写吧. 最开始接触函数式编程的时候,第一个接触的概念就是高阶函数,和柯里化.咋一看,这不就是长期用来 ...

  4. 【Python】[函数式编程]高阶函数,返回函数,装饰器,偏函数

    函数式编程高阶函数 就是把函数作为参数的函数,这种抽象的编程方式就是函数式编程.--- - -跳过,不是很理解,汗 - ---

  5. 从函数式编程到Ramda函数库(二)

    Ramda 基本的数据结构都是原生 JavaScript 对象,我们常用的集合是 JavaScript 的数组.Ramda 还保留了许多其他原生 JavaScript 特性,例如,函数是具有属性的对象 ...

  6. Python之路(第七篇)Python作用域、匿名函数、函数式编程、map函数、filter函数、reduce函数

    一.作用域 return 可以返回任意值例子 def test1(): print("test1") def test(): print("test") ret ...

  7. 前端分享----JS异步编程+ES6箭头函数

    前端分享----JS异步编程+ES6箭头函数 ##概述Javascript语言的执行环境是"单线程"(single thread).所谓"单线程",就是指一次只 ...

  8. python函数式编程之返回函数、匿名函数、装饰器、偏函数学习

    python函数式编程之返回函数 高阶函数处理可以接受函数作为参数外,还可以把函数作为结果值返回. 函数作为返回值 def laxy_sum(*args): def sum(): ax = 0; fo ...

  9. Python之路Python作用域、匿名函数、函数式编程、map函数、filter函数、reduce函数

    Python之路Python作用域.匿名函数.函数式编程.map函数.filter函数.reduce函数 一.作用域 return 可以返回任意值例子 def test1(): print(" ...

随机推荐

  1. 为产品接入微信支付解决方案(公司&个人)

    微信支付个人及公司的区别 H5支付:主要实现的效果是在非微信内网页中点击支付,拉起微信APP内的微信支付进行付款. APP支付:主要实现的效果是在APP内部点击支付,拉起微信APP内的微信支付进行付款 ...

  2. 递归遍历树形json

    前置知识: 1.首先 js里面“万物皆对象” 2.递归:自己调用自己(递归的优缺点:https://www.cnblogs.com/tchjs/p/4428153.html  https://www. ...

  3. mysql ibd 文件过大问题

    公司的数据库挂了查了下 ,每个表都有自己独立的表空间,有一张表的ibd 文件有好几G了.然后想要释放它. 解决方案: 第一种,删除表,然后重新建.drop table 操作自动回收表空间 第二种,al ...

  4. Jmeter4.0----cookie(8)

    1.说明 在脚本编写的过程中,我们常常会遇到用户登录的情况,并且将部分重要信息保存在用户的cookie中,所以,来说一下,对用户登录产生cookie的操作情况. 2.步骤 第一步:添加HTTP Coo ...

  5. c# 类名不同,字段相同,如何快速给类赋值

    1,相关的两个类如下:现在我们知道短信的值,如何给微信来赋值呢,需要用到我们的反射,当然字段一一赋值也可以,但是如果字段有100个,这个方法就不行啦 /// <summary> /// 短 ...

  6. fleet - 基于Machine Metadata的任务调度

    基于Machine Metadata的任务调度 复杂和特定的要求的应用程序可以针对一个子集的集群调度通过machine metadata.强大的部署拓扑结构,可以实现的基础上的机器的地区,机架位置,磁 ...

  7. jQuery知识点小结

    博主之前学习一段时间后做了点Demo,借此机会发出来分享,其实学jQuery只要简单看看文档即可,但有些细枝末节的东西文档会默认使用者是了解的,所以还是得系统学习系统训练:Talk is cheap, ...

  8. Jenkins任务失败,发送邮件通知

    1.进入系统管理->系统设置,然后进行下面设置: 2.配置管理员邮件账号,需要和后面的邮件发送者一致.否则可能会发送不成功 3.配置基础的邮件发送的配置 4.配置邮件扩展配置--用来自定义邮件格 ...

  9. C++拾遗(六)——复制控制

    年前忙了几天,到现在才算是有空休息下来.先祝大家新年快乐,心想事成:)我也会发笑脸o.o 这篇博文主要介绍定义一个类型的对象时的复制控制方式,这部分内容之前有一定的了解但又浅尝辄止,始终感觉没能找到要 ...

  10. SQLServer 2012 Always on配置全过程

    AlwaysOn取数据库镜像和故障转移集群之长.AlwaysOn不再像故障转移集群那样需要共享磁盘,从而主副本和辅助副本可以更容易的部署到不同的地理位置:AlwaysOn还打破了镜像只能1对1的限制, ...