纯函数

纯函数:函数的返回值由传入的参数决定,即相同的参数返回相同的结果。

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函数式编程指南》(一)相关推荐

  1. mysql数据库权威指南_MySQL_MySQL权威指南读书笔记(三),第二章:MYSQL数据库里面的数 - phpStudy...

    MySQL权威指南读书笔记(三) 第二章:MYSQL数据库里面的数据 用想用好MYSQL,就必须透彻理解MYSQL是如何看待和处理数据的.本章主要讨论了两个问题:一是SQL所能处理的数据值的类型:二是 ...

  2. MongoDB权威指南读书笔记——CRUD

    插入并保存文档 插入是向MongoDB中添加数据的基本方法.可以使用Insert方法向目标集合插入一个文档:db.foo.insert({"bar" : "baz&quo ...

  3. HTTP权威指南读书笔记

    <<HTTP权威指南>>读书笔记 第一部分:Web的基础 第1章:HTTP概述 主要内容 1.什么是HTTP 2.HTTP的基本组件 HTTP HTTP:HTTP(Hypert ...

  4. HTML5权威指南----读书笔记

    <!DOCTYPE html> <html> <head><meta name = 'keywords' content="HTML5权威指南--- ...

  5. 计算机网络和http权威指南 读书笔记

    计算机网络笔记 网络层 网络层向上提供无连接的,尽最大努力交付的数据报服务 网络层不提供数据质量承诺 物理层使用的中间设备叫转发器repeater 数据链路层叫网桥bridge 网络层叫路由器rout ...

  6. MapReduce总结 + 相关Hadoop权威指南读书笔记(未完......欢迎补充,互相学习)

    文章目录 MapReduce概述 MapReduce优缺点 MapReduce核心思想 MapReduce进程 MapReduce编程规范 WordCount 案例实操 本地测试 集群测试 Hadoo ...

  7. android开发读书笔记,android开发权威指南读书笔记

    第17章 Fragment 1.在res目录下增加 layout-sw600dp 目录,用于存放7英寸及以上尺寸屏幕的布局文件.10英寸以上平板用 sw720dp.如果是更小的屏幕,如 480*800 ...

  8. java性能权威指南中文_Java性能权威指南读书笔记--之一

    JIT(即时编译) 解释型代码:程序可移植,相同的代码在任何有适当解释器的机器上,都能运行,但是速度慢. 编译型代码:速度快,电视不同CPU平台的代码无法兼容. java则是使用java的编译器先将其 ...

  9. javascript权威指南读书笔记之二——词法结构

    本章讲述的内容,用通俗的语言来说,就是应该注意的地方,这些也许和我们所学的其他语言类似,也许完全不同,比如一开始就介绍说javascript程序中的每个字符都是用两个字节表示的,但有些程序设计者习惯于 ...

  10. HTTP权威指南读书笔记(一)HTTP概述、URL和资源及报文详解

    一.HTTP概述 1.WEB客户端和服务器. 2.资源:资源可以是各种格式的静态文件,也可以是应用程序. 3.媒体类型 4.URI:统一资源标识符 URL:统一资源定位符. URL的第一部分称为方案: ...

最新文章

  1. 构建从目标到研发过程的全生命周期体验
  2. 利用计算机模拟人脑进行演绎,2014年4月自学考试计算机应用技术试题
  3. 计算机科学与技术python方向是什么意思-第一模块·开发基础-第1章 Python基础语法...
  4. SGU 269. Rooks(DP)
  5. 拿着5家offer的Java,对面试官做了什么?
  6. 推荐算法--推荐系统架构(06)
  7. 关于C语言中的Bool类型变量的一点看法
  8. 后疫情时代,那些迎来爆发机会的产业
  9. Java连接sap无明显报错信息,Kettle连接SAP报错问题
  10. CMMI与Agile敏捷开发比较之二:需求管理篇(兼谈用敏捷实现和满足CMMI的ReqM过程域)...
  11. informix mysql,Informix相当于mysql的SHOW CREATE TABLE
  12. 设计模式学习与应用——单例模式
  13. 用计算机弹出记事本,为何电脑开机会弹出desktop的记事本出来的
  14. 设计模式之策略模式:模拟鸭子
  15. CSS3的新特性以及IE下的实现
  16. 股票涨跌的心理学原理: 前景理论
  17. 企业邮箱管理员在哪里找?域名邮箱如何管理?
  18. uni-app开发安卓APP运行到真机,未检测到手机或模拟器
  19. 计量经济学之时间序列的平稳性、单位根检验、协整检验、时间序列数据的一般处理流程
  20. 他们如何利用微信赚钱

热门文章

  1. win10计算器_计算器也能刷Win10,国外大神又现惊人操作
  2. 科技公司要干掉专业媒体?先迈过内容这道大坎
  3. 篮球爱好和程序的结合:C#生成NBA赛事预告页面
  4. 360浏览器网页按钮点击无效
  5. 2018年买华硕笔记本 安装 Fedora 28,pcieport errors flood the journal
  6. 一加5t ,安卓p系统卡在更新页面,安卓p降级教程(一加5t测试通过)
  7. 京东/淘宝的手机销售榜(前4名 -- 手机品牌 --手机型号*3 --手机分辨率 -- 手机操作系统 --安卓版本号)
  8. php市场占比 2019,2019年家电市场份额占比排名
  9. 一代盘神谢幕!百度网盘 Pandownload 开发者被抓了!
  10. 光滑噪声数据常用的方法_整理一份详细的数据预处理方法