拉姆达函数
4个原则
1.可预测的
2.安全的
3.透明的
4.积木式的

函数式编程需要用到的ES6知识
let const(地址连接固定)
箭头函数
扩展运算符
解构赋值 剩余运算符

形参默认值
Object.assign
Class语法糖

Pure纯函数
纯函数例子
保证了结果的可预测性,
返回值取决于参数,
没有任何副作用,
同样的参数调用多次结果确保一样,
返回结果不依赖任何全局变量
非纯函数例子
返回结果取决于全局变量,
全局变量改变后,
返回的结果就会改变
难以测试
隐藏的状态无法保证
改为纯函数,更容易测试,只需要测试入参和返回值
返回值随机也不是纯函数
Declarative声明式(可预测的)
为什么不要使用命令式IMPREATIVE?
命令式语句示例
什么是声明式DECLARATIVE
声明式声明了我们想要的结果
声明式声明了我们想要的结果
声明式使得结果更加容易被预测

Immutable不可改变的状态(安全性)
创造状态而不是改变状态保证了安全性
改变状态的例子
如何冻结状态
ES5中的Object.freeze和fb的immutable.js

冻结状态会爆出错误

Free your state让状态变得透明(透明性)

状态不透明的示例
如何改为状态透明?=>通过创建新的状态

赞成
安全性/日志/清晰的数据处理/并发安全性(因为状态不改变)/占用内存小
反对
啰嗦/更多对象创建/垃圾回收/内存占用
可通过使用immutable.js减轻

first class functions 一等公民函数
一等公民意味着什么
可以被赋值
可以当作参数传递给其他函数
Closures闭包
闭包允许我们封装一些状态(partial/curry/compose/higher order)
闭包例子
高阶函数 返回值是另一个函数
可以通过这个函数能记住上一次的参数来创建新函数

使用这个特性可以去除冗余


函数作为一等公民是高阶函数的基石
Partial Application偏函数
如何复用之前的例子

使用偏函数

如何写一个偏函数
使用bind和ES6中的展开运算符

Currying柯里化
柯里化和偏函数的不同
柯里化会自动创建偏函数,而不需要手动创建
使用柯里化来改写的例子


使用ES6来改写原函数为柯里化



piecing it together如何应用到实际代码中
使用函数块来组合流程





Composing closures 给闭包组合编排
piping用管道输送

compose示例


如何在之前的示例中使用compose
把三遍循环做的事变成一次循环做的事


Recursion中使用函数式编程

典型例子

命令式
声明式
递归步骤
递归表现

爆栈


未优化的


优化后的








Recap回顾
可预测的
安全的
状态透明的
模块化的
















