特点
- 函数是一等公民,可以被赋值、作为参数传递、作为返回值等等。
函数可以被赋值给一个变量; 函数可以被当作参数传递给其他函数; 函数可以作为另一个函数的返回值
- 声明式编程,强调描述要达到的目标,而不是具体实现的步骤。
- 惰性执行,只有在需要时才会执行。
- 无状态,数据不可变,避免出现意外的副作用。
- 纯函数,即相同的输入永远得到相同的输出,没有可观察的副作用。
什么是纯函数
副作用即和函数外部环境发生的交互就是副作用 纯函数是这样一种函数,即相同的输入,永远会得到相同的输出,而且没有任何可观察的副作用。 纯函数也可以理解为数学上的函数
- 更改文件系统
- 往数据库插入记录
- 发送一个 http 请求
- 可变数据
- 打印/log
- 获取用户输入
- DOM 查询
- 访问系统状态
优点
- 可缓存,避免重复计算相同的结果。
- 可移植,可以在不同的平台上使用。
- 可测试,因为纯函数可以更容易地进行单元测试。
- 函数合成,可以把多个函数组合成一个更大的函数。
- 函数柯里化,可以把多个参数的函数转换成接受一个参数的函数,有助于函数复用和组合。
函数合成
jsfunction compose(...args) { return function (value) { return args.reduceRight((previousValue, currentValue) => { return currentValue(previousValue) },value) } }
函数柯里化
只传递给函数一部分参数来调用它,让它返回一个函数去处理剩下的参数 函数柯里化利用闭包对函数参数进行缓存,可以把函数分为更细粒度
jsconst curry = (fn, ...args) => args.length >= fn.length ? fn(...args) : (..._args) => curry(fn, ...args, ..._args);
常用库
- ramda 提供了一系列的函数式编程工具函数。
- rxjs 提供了响应式编程工具,可以方便地处理异步事件流。
- underscorejs 提供了一系列的实用工具函数。
- immerjs 可以方便地实现不可变数据。
- immutable 提供了一系列的不可变数据结构。