目录
函数引用透明性
- 引用透明性:所有函数对于相同输入都返回相同值
- 函数式编程是一种范式,仅仅依赖输入就可以完成自身逻辑。
- 函数的逻辑不依赖其他全局变量,这使得并发代码和缓存成为可能
- 遵循引用透明性的函数只能依赖来自参数的输入,因此线程可以自由运行没有任何锁机制
纯函数
定义:遵循引用透明,对定的输入返回相同输出。
- 纯函数不依赖于任何外部变量,有助于我们更容易测试代码
- 纯函数不会改变它的环境,不需要担心同步问题,允许我们并发的执行代码
ECMAScript
ECMAScrit是JavaScript的规范
ECMAScript6 简称ES6,引入class,symbol,箭头函数,generator等
第一个函数
()=>""
//()表示函数参数
//=>是函数体定义的开始
//后面的内容是函数体/定义
一个简单的有名字的函数
//ES6
var hanshu =()=>"fanhui"
//ES5
var hansh=function hanshu(){
return "fanhui"
}
严格模式
定义全局变量会报错(不使用var)
"use strict"
多语句函数
var hanshu =()=>{
let value="fanhui"
return value;
}//用{}包裹多条语句
- es5函数在es6中是有效的
export 要点
把文件本身看做一个模块,伴随模块的概念产生了import和export 概念
高阶函数
定义:接受函数作为参数或者返回函数作为输出的函数
存储函数
把一个函数存入对象 fn类型是function
let fn=()=>{}
foreach函数
定义
foreachobject函数
定义
用法
unless函数
定义
some函数
times函数
every函数
compare骨架
sortby函数
定义
闭包
- 闭包是一个内部函数
- 作用域
- 自身声明内的变量
- 全局变量
- 对外部函数变量的访问
- 闭包可以记住上下文
函数封装到对象中
数组的函数式编程
map函数
投影函数返回一个数组
filter函数
投影函数
contatall函数
把所有嵌套数组整合到一个数组中
reduce函数
zip函数
合并两个给定的数组
柯里化与偏应用
变参函数
接受可变数量参数的函数
拓展运算符...
捕获函数的额外参数
柯里化定义
把一个多参函数转化成嵌套的一元函数
const add=(x,y)=>x+y
//柯里化版本
const add=x=>y=>x+y;
柯里化函数作用
利用闭包性质可以解决重复利用参数的问题,简化代码
curry函数
- 应用参数的列表从左到右,
- 柯里化函数一般总在最后接受数组
偏函数
JavaScript中的偏函数、是指一个函数,它是由另一个函数通过固定一些参数而得到的,从而产生了一个新的函数。
- 可以减少重复代码。在某些场景下,多个函数的参数有一些相同的部分,使用偏函数可以将这些共同的部分提取出来,避免在多个函数中重复写相同的代码。
- 可以使代码更加模块化。偏函数可以将一个大函数拆分成多个小函数,每个小函数只负责一部分参数的处理,使得代码更加清晰、易于维护。
- 可以方便地实现柯里化。偏函数是柯里化的一种特殊形式,它可以为柯里化提供一个简单、快速的实现方式。
组合与管道
组合的定义
函数式组合在函数式编程中被称为组合。
组合函数思想:把小函数组合成大函数
组合函数的优势
无需创建新的函数就可以通过基础函数解决眼前问题
- 基础函数:每一个基础函数都需要接受一个参数并返回数据
- 当函数接收只一个参数时我们才能将两个函数组合
unix理念
- 每个程序只做好一件事。为了完成一项新任务,重新构建要好于在复杂程序中添加新属性
- 每个程序输出应该是另一个尚未可知的程序的输入
| 管道符号
- 允许我们通过组合一些函数去创建能够解决问题的新函数
- | 将最左端的函数输出作为输入发送给右侧函数
compose函数
返回一个函数,b的返回值作为参数传给a
应用
组合多参数函数
- 利用上一章柯里化和偏应用转化为一元函数再组合
- 从右至左执行
pipe函数
compose函数的复制品,唯一修改的是数据流,从左到右执行
identity函数
compose函数的调试工具
将identity添加到数据流中可能出错的位置,会打印上一个函数接收到的输入参数
函子
定义
函子是容器
函子实现的map方法
实现了map函数在每次遍历时产生新的对象
maybe函子
使代码没有在null或underfined值下崩溃
either函子
解决分支拓展问题,帮助我们在拓展分支时保存错误信息?
pointed函子
实现了of契约接口
Monad
Monad是一个含有chain方法的函子,有助于扁平化MayBe数据
generator
解决异步代码回调地狱问题
同步
函数在执行时会阻塞调用者,并在执行完毕后返回结果
异步
函数在执行时不会阻塞调用者,但是一旦执行完毕就会返回结果