第1章 函数式编程简介 1
1.1什么是函数式编程?为何它重要 1
1.2引用透明性 4
1.3命令式、声明式与抽象 5
1.4函数式编程的好处 7
1.5纯函数 7
1.5.1纯函数产生可测试的代码 7
1.5.2合理的代码 9
1.6并发代码 10
1.7可缓存 11
1.8管道与组合 12
1.9纯函数是数学函数 13
1.10我们要构建什么 15
1.11 JavaScript是函数式编程语言吗 15
1.12小结 16
第2章JavaScript函数基础 17
2.1 ECMAScript历史 18
2.2创建并执行函数 19
2.2.1第一个函数 19
2.2.2严格模式 21
2.2.3 return语句是可选的 22
2.2.4多语句函数 22
2.2.5函数参数 24
2.2.6 ES5函数在ES6中是有效的 24
2.3设置项目 24
2.3.1初始设置 24
2.3.2用第一个函数式方法处理循环问题 26
2.3.3 export要点 28
2.3.4 import要点 28
2.3.5使用babel-node运行代码 29
2.3.6在npm中创建脚本 30
2.3.7从git上运行源代码 31
2.4小结 31
第3章 高阶函数 33
3.1理解数据 34
3.1.1理解JavaScript数据类型 34
3.1.2存储函数 35
3.1.3传递函数 35
3.1.4返回函数 37
3.2抽象和高阶函数 38
3.2.1抽象的定义 38
3.2.2通过高阶函数实现抽象 39
3.3真实的高阶函数 42
3 3.1 every函数 42
3.3.2 some函数 44
3.3.3 sort函数 44
3.4小结 48
第4章 闭包与高阶函数 49
4.1理解闭包 50
4.1.1什么是闭包 50
4.1.2记住闭包生成的位置 52
4.1.3回顾sortBy函数 53
4.2真实的高阶函数(续) 54
4.2.1 tap函数 54
4.2.2 unary函数 56
4.2.3 once函数 57
4.2.4 memoized函数 58
4.3小结 60
第5章 数组的函数式编程 61
5.1数组的函数式方法 62
5.1.1 map 62
5.1.2 filter 65
5.2连接操作 67
5.3 reduce函数 71
5.4 zip数组 77
5.5小结 81
第6章 柯里化与偏应用 83
6.1一些术语 84
6.1.1一元函数 84
6.1.2二元函数 84
6.1.3变参函数 84
6.2柯里化 86
6.2.1柯里化用例 87
6.2.2日志函数——应用柯里化 89
6.2.3回顾curry 90
6.2.4回顾日志函数 93
6.3柯里化实战 94
6.3.1在数组内容中查找数字 94
6.3.2求数组的平方 95
6.4数据流 96
6.4.1偏应用 96
6.4.2实现偏函数 97
6.4.3柯里化与偏应用 99
6.5小结 100
第7章 组合与管道 101
7.1组合的概念 102
7.2函数式组合 104
7.2.1回顾map与filter 104
7.2.2.compose函数 106
7.3应用compose函数 106
7.3.1引入curry与partial 108
7.3.2组合多个函数 111
7.4管道/序列 113
7.5组合的优势 114
7.5.1组合满足结合律 114
7.5.2使用tap函数调试 115
7.6小结 116
第8章 函子 117
8.1什么是函子 118
8.1.1函子是容器 118
8.1.2函子实现了map方法 120
8.2 MayBe函子 121
8.2.1实现MayBe函子 122
8.2.2简单用例 123
8.2.3真实用例 125
8.3 Either函子 129
8.3.1实现Either函子 130
8.3.2 reddit例子的Either版本 131
8.4 Pointed函子 134
8.5小结 134
第9章 深入理解Monad 135
9.1根据搜索词条获取Reddit评论 136
9.2问题描述 136
9.2.1实现第一步 138
9.2.2合并Reddit调用 141
9.2.3多个map的问题 144
9.3通过join解决问题 146
9.3.1实现join 146
9.3.2实现chain 148
9.4小结 151
第10章 使用Generator 153
10.1异步代码及其问题 154
10.2 Generator基础 156
10.2.1创建 Generator 156
10.2.2 Generator的注意事项 157
10.2.3 yield关键字 158
10.2.4 done属性 160
10.2.5向Generator传递数据 162
10.3使用Generator处理异步调用 164
10.3.1一个简单的案例 164
10.3.2一个真实的案例 169
10.4小结 172
附录 173