拉姆达函数

image.pngimage.png
image.png
image.png

4个原则

1.可预测的

image.png

2.安全的

image.png

3.透明的

image.png

4.积木式的

image.png

函数式编程需要用到的ES6知识

let const(地址连接固定)

image.png

箭头函数

image.pngimage.png

扩展运算符image.png

image.png

解构赋值 剩余运算符

image.png

image.png

形参默认值image.png

Object.assign

image.png

Class语法糖

image.png

Pure纯函数

纯函数例子

保证了结果的可预测性,
返回值取决于参数,
没有任何副作用,
同样的参数调用多次结果确保一样,
返回结果不依赖任何全局变量
image.png

非纯函数例子

返回结果取决于全局变量,
全局变量改变后,
返回的结果就会改变image.png
难以测试
image.png
隐藏的状态无法保证
image.png
改为纯函数,更容易测试,只需要测试入参和返回值
image.png

返回值随机也不是纯函数

image.png

Declarative声明式(可预测的)

为什么不要使用命令式IMPREATIVE?

imperative sentence 命令式语句
image.png

命令式语句示例

我们只是给计算机一堆命令去做什么, 但是并不知道我们要什么
image.png

什么是声明式DECLARATIVE

声明式声明了我们想要的结果
image.png

声明式声明了我们想要的结果

我们不关心计算机时如何实施的,但是我们知道自己想要的结果image.png

声明式使得结果更加容易被预测

image.png

Immutable不可改变的状态(安全性)

创造状态而不是改变状态保证了安全性

我们不去改变对象的属性和数组的项,我们创建image.png

改变状态的例子image.png

如何冻结状态

ES5中的Object.freeze和fb的immutable.js

image.png

冻结状态会爆出错误

image.png

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

image.png

状态不透明的示例

image.png

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

image.png

赞成

安全性/日志/清晰的数据处理/并发安全性(因为状态不改变)/占用内存小

image.png

反对

啰嗦/更多对象创建/垃圾回收/内存占用
可通过使用immutable.js减轻

image.png

first class functions 一等公民函数

一等公民意味着什么

可以被赋值
可以当作参数传递给其他函数
image.png

Closures闭包

闭包允许我们封装一些状态(partial/curry/compose/higher order)

image.png

闭包例子

高阶函数 返回值是另一个函数
可以通过这个函数能记住上一次的参数来创建新函数

image.png

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

image.png
image.png

函数作为一等公民是高阶函数的基石image.png

Partial Application偏函数

如何复用之前的例子

image.png

使用偏函数

image.png

image.png

如何写一个偏函数

使用bind和ES6中的展开运算符

image.png

Currying柯里化

柯里化和偏函数的不同

柯里化会自动创建偏函数,而不需要手动创建

使用柯里化来改写的例子

image.png
image.png

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

image.png
image.png

image.png

piecing it together如何应用到实际代码中

使用函数块来组合流程

image.png
image.png

image.png

image.png

image.png

Composing closures 给闭包组合编排

piping用管道输送

image.png

compose示例

image.png

image.png

如何在之前的示例中使用compose

把三遍循环做的事变成一次循环做的事
image.png
image.png

image.png

Recursion中使用函数式编程

image.png

典型例子

image.png

命令式

image.png

声明式

image.png
image.png
image.pngimage.pngimage.pngimage.pngimage.png
image.png
image.png
image.png

递归步骤

image.png

递归表现

image.png

爆栈
image.png

image.png

image.png

image.png
image.png
image.png

未优化的

image.png
image.png

优化后的

image.pngimage.png

image.png

image.png
image.png

image.png

image.png

image.png

Recap回顾

可预测的
安全的
状态透明的
模块化的
image.png