【读书笔记】《JS函数式编程指南》(一)
纯函数
纯函数:函数的返回值由传入的参数决定,即相同的参数返回相同的结果。
slice和splice,表现作用相似。
slice浅复制,返回复制之后的数组
splice删除数组元素,返回删除元素
slice执行之后元素组还是一致,是纯函数;splice执行后是改变了的原数组
所以slice是纯函数,而splice是具有副作用的不纯函数
副作用
副作用是计算结果过程中,系统状态的一种变化,或者与外部世界进行的可观察变化。
只要是跟函数外部环境发生的交互,就是副作用。
副作用包括,但不限于:
更改文件系统
往数据库插入记录
发送一个 http 请求
可变数据
打印/log
获取用户输入
DOM 查询
访问系统状态
为什么要纯函数?
1、可缓存。因为纯函数相同的输入必定返回相同的结果。
2、依赖明确、易于观察和理解。通过传递参数可以知道函数需要什么,大概做什么;同时把依赖当参数传递,在不同的使用环境传递不同的Db或新的Email就行了,可移植性。
3、方便测试。比如测试请求,不需要真正发送请求,只需要给定函数参数,断言输出即可,因为纯函数相同的参数必定返回相同的结果。
4、合理性。如果一段代码可以替换成它执行所得的结果,而不用改变整个程序的行为,那么这段代码就是引用透明的,纯函数就是如此。
5、并行代码。纯函数没有副作用,不需要访问共享内存。
纯函数参数明确,使用Db,Email,attrs,纯函数能够提供多得多的信息。
通过强迫“注入”依赖,或者把它们当作参数传递,我们的应用也更加灵活;因为数据库或者邮件客户端等等都参数化了(别担心,我们有办法让这种方式不那么单调乏味)。如果要使用另一个 Db,只需把它传给函数就行了。如果想在一个新应用中使用这个可靠的函数,尽管把新的 Db 和 Email 传递过去就好了,非常简单。
// 不纯的
var signUp = function(attrs) {var user = saveUser(attrs);welcomeUser(user);
};var saveUser = function(attrs) {var user = Db.save(attrs);...
};var welcomeUser = function(user) {Email(user, ...);...
};// 纯的
var signUp = function(Db, Email, attrs) {return function() {var user = saveUser(Db, attrs);welcomeUser(Email, user);};
};var saveUser = function(Db, attrs) {...
};var welcomeUser = function(Email, user) {...
};
函数柯里化
柯里化概念:函数接收部分参数并执行,返回一个函数去处理剩下参数。
利用闭包保存 参数 x
var add = function(x) {return function(y) {return x + y;};
};var increment = add(1);
var addTen = add(10);increment(2);
// 3addTen(2);
// 12
代码组合(compose)
var compose = function(f,g) {return function(x) {return f(g(x));};
};
f、g都是函数,x是他们之间的“管道”传输值。
组合compose看起来像饲养函数,把两个喜欢的函数结合,产生新的函数。
使用效果:
compose把toUpperCase和exclaim结合,变成exclaim(toUpperCase(x))
shout(“send in the clowns”) == 》 exclaim(toUpperCase(“send in the clowns”))
var toUpperCase = function(x) { return x.toUpperCase(); };
var exclaim = function(x) { return x + '!'; };
var shout = compose(exclaim, toUpperCase);shout("send in the clowns");
//=> "SEND IN THE CLOWNS!"
compose定义中,g函数先于f执行,执行顺序从右到左,从而创建了一个从右到左的数据流,这样代码可读性远高于嵌套一堆函数。
【读书笔记】《JS函数式编程指南》(一)相关推荐
- mysql数据库权威指南_MySQL_MySQL权威指南读书笔记(三),第二章:MYSQL数据库里面的数 - phpStudy...
MySQL权威指南读书笔记(三) 第二章:MYSQL数据库里面的数据 用想用好MYSQL,就必须透彻理解MYSQL是如何看待和处理数据的.本章主要讨论了两个问题:一是SQL所能处理的数据值的类型:二是 ...
- MongoDB权威指南读书笔记——CRUD
插入并保存文档 插入是向MongoDB中添加数据的基本方法.可以使用Insert方法向目标集合插入一个文档:db.foo.insert({"bar" : "baz&quo ...
- HTTP权威指南读书笔记
<<HTTP权威指南>>读书笔记 第一部分:Web的基础 第1章:HTTP概述 主要内容 1.什么是HTTP 2.HTTP的基本组件 HTTP HTTP:HTTP(Hypert ...
- HTML5权威指南----读书笔记
<!DOCTYPE html> <html> <head><meta name = 'keywords' content="HTML5权威指南--- ...
- 计算机网络和http权威指南 读书笔记
计算机网络笔记 网络层 网络层向上提供无连接的,尽最大努力交付的数据报服务 网络层不提供数据质量承诺 物理层使用的中间设备叫转发器repeater 数据链路层叫网桥bridge 网络层叫路由器rout ...
- MapReduce总结 + 相关Hadoop权威指南读书笔记(未完......欢迎补充,互相学习)
文章目录 MapReduce概述 MapReduce优缺点 MapReduce核心思想 MapReduce进程 MapReduce编程规范 WordCount 案例实操 本地测试 集群测试 Hadoo ...
- android开发读书笔记,android开发权威指南读书笔记
第17章 Fragment 1.在res目录下增加 layout-sw600dp 目录,用于存放7英寸及以上尺寸屏幕的布局文件.10英寸以上平板用 sw720dp.如果是更小的屏幕,如 480*800 ...
- java性能权威指南中文_Java性能权威指南读书笔记--之一
JIT(即时编译) 解释型代码:程序可移植,相同的代码在任何有适当解释器的机器上,都能运行,但是速度慢. 编译型代码:速度快,电视不同CPU平台的代码无法兼容. java则是使用java的编译器先将其 ...
- javascript权威指南读书笔记之二——词法结构
本章讲述的内容,用通俗的语言来说,就是应该注意的地方,这些也许和我们所学的其他语言类似,也许完全不同,比如一开始就介绍说javascript程序中的每个字符都是用两个字节表示的,但有些程序设计者习惯于 ...
- HTTP权威指南读书笔记(一)HTTP概述、URL和资源及报文详解
一.HTTP概述 1.WEB客户端和服务器. 2.资源:资源可以是各种格式的静态文件,也可以是应用程序. 3.媒体类型 4.URI:统一资源标识符 URL:统一资源定位符. URL的第一部分称为方案: ...
最新文章
- 构建从目标到研发过程的全生命周期体验
- 利用计算机模拟人脑进行演绎,2014年4月自学考试计算机应用技术试题
- 计算机科学与技术python方向是什么意思-第一模块·开发基础-第1章 Python基础语法...
- SGU 269. Rooks(DP)
- 拿着5家offer的Java,对面试官做了什么?
- 推荐算法--推荐系统架构(06)
- 关于C语言中的Bool类型变量的一点看法
- 后疫情时代,那些迎来爆发机会的产业
- Java连接sap无明显报错信息,Kettle连接SAP报错问题
- CMMI与Agile敏捷开发比较之二:需求管理篇(兼谈用敏捷实现和满足CMMI的ReqM过程域)...
- informix mysql,Informix相当于mysql的SHOW CREATE TABLE
- 设计模式学习与应用——单例模式
- 用计算机弹出记事本,为何电脑开机会弹出desktop的记事本出来的
- 设计模式之策略模式:模拟鸭子
- CSS3的新特性以及IE下的实现
- 股票涨跌的心理学原理: 前景理论
- 企业邮箱管理员在哪里找?域名邮箱如何管理?
- uni-app开发安卓APP运行到真机,未检测到手机或模拟器
- 计量经济学之时间序列的平稳性、单位根检验、协整检验、时间序列数据的一般处理流程
- 他们如何利用微信赚钱
热门文章
- win10计算器_计算器也能刷Win10,国外大神又现惊人操作
- 科技公司要干掉专业媒体?先迈过内容这道大坎
- 篮球爱好和程序的结合:C#生成NBA赛事预告页面
- 360浏览器网页按钮点击无效
- 2018年买华硕笔记本 安装 Fedora 28,pcieport errors flood the journal
- 一加5t ,安卓p系统卡在更新页面,安卓p降级教程(一加5t测试通过)
- 京东/淘宝的手机销售榜(前4名 -- 手机品牌 --手机型号*3 --手机分辨率 -- 手机操作系统 --安卓版本号)
- php市场占比 2019,2019年家电市场份额占比排名
- 一代盘神谢幕!百度网盘 Pandownload 开发者被抓了!
- 光滑噪声数据常用的方法_整理一份详细的数据预处理方法