一. 函数式编程
1. 声明式(Declarativ)
和声明式相对应的编程式叫做命令式编程(ImperativeProgramming), 命令式编程也是最常见的种编程式.
- // 命令式编程:
- function double(arr) {
- const results = []
- for (let i = 0; i <arr.length; i++){
- results.push(arr[i] * 2)
- }
- return results
- }
- function addOne(arr){
- const results = []
- for (let i = 0; i < arr.length; i++){
- results.push(arr[i] +1)
- }
- return results
- }
- // 声明式:
- const double = arr => arr.map(item => item * 2);
- const addOne = arr => arr.map(item => item + 1);
2. 纯函数(Pure Function)
函数的执过程完全由输参数决定, 不会受除参数之外的任何数据影响.
函数不会修改任何外部状态, 如修改全局变量或传的参数对象.
相反的不纯函数:
改变全局变量的值.
改变输参数引的对象, 就像上不是纯函数的 arrayPush 实现.
读取户输, 如调了 alert 或者 confirm 函数.
抛出个异常.
络输 / 输出操作, 如通过 Ajax 调个服务器的 API.
操作浏览器的 DOM.
满纯函数的特性也叫做引透明度(Referential Transparency), 这是更加正式的说法. 怎么称呼不重要, 重要的是开发者要理解, 所谓的纯函数, 做的事情就是输参数到返回结果的个映射, 不要产副作(Side Effect).
3. 数据不可变性(Immutability)
数据不可变 (Immutable) 是函数式编程常重要的个概念, 程序要好发挥作当然是要产变化的数据, 但是并不意味着必须要去修改现有数据, 替换法是通过产新的数据, 来实现这种 "变化", 也就是说, 当我们需要数据状态发改变时, 保持原有数据不变, 产个新的数据来体现这种变化. 不可改变的数据就是 Immutable 数据, 它旦产, 我们就可以肯定它的值永远不会变, 这常有利于代码的理解.
注意: JavaScript 中的 const 关键字虽然有常数 (constant) 的意思, 但其实只是规定个变量引的对象不能改变, 却没有规定这个 const 变量引的对象不能发改变, 所以, 这个 "常量" 依然是变量.
问题: JavaScript 算不算函数式编程语言?
从语言的角度上讲, JavaScript 并是纯粹的函数式编程语言, JavaScript 中的函数有第公民的份, 因为函数本就是个对象, 可以被赋值给个变量, 可以作为参数传递, 由此可以很便地应函数式编程的许多思想. 我们把函数式编程看作种编程思想, 即使语本不持些特性, 我们依然可以应这样的编程思想, 于提代码的质量. 所以, JavaScript 并不是纯粹的函数式编程语, 但是, 通过应些编程规范, 再借助点具的帮助, 我们完全可以 JavaScript 写出函数式的代码, RxJS 就是辅助我们写出函数式代码的种.
二. 响应式编程(Reactive Programming)
就像 excell, 试着 Excel 把多个星期的花费综合加起来放在另个叫 c9 格, c9 能够对花费的格的数值变化作出 "响应".
例如, 在命令式编程环境中, a:=b+c 表示将表达式的结果赋给 a, 而之后改变 b 或 c 的值不会影响 a. 但在响应式编程中, a 的值会随着 b 或 c 的更新而更新.
Reactive Extension 简称 Rx(响应式编程世界知名度最的框架)
An API for asynchronous programming with observable streams . Rx 是套通过可监听流来做异步编程的 API.
Rx 其实是个家族, 在这个家族中, 还有 Java 实现的 RxJava, C++ 实现的 RxCpp, Ruby 实现的 Rx.rb, Python 实现的 RxPy, 当然, 还有这个家族中最年长的 Rx.NET.RxJS, 也就是 Rx 的 JavaScript 语实现.
Rx(包括 RxJS)诞的主要的虽然是解决异步处理的问题, 但并不表 Rx 不适合同步的数据处理, 实际上, 使 RxJS 之后部分代码不需要关是被同步执还是异步执, 所以处理起来会更加简单.
RxJS 属于 "函数响应式编程".
函数响应式编程的优势
数据流抽象了很多现实问题.
擅长处理异步操作.
把复杂问题分解成简单问题的组合.
来源: https://www.cnblogs.com/honkerzh/p/10794459.html