对于前端, 所有的成员是一个集合, 变形关系是函数.
函数式编程基础理论
1.. 函数式编程 (Functional Programming) 其实相对于计算机的历史而言是一个非常古老的概念, 甚至早于第一台计算机的诞生. 函数式编程的基础模型来源于 λ (Lambda x=>x*2)演算, 而 λ 演算并非设计于在计算机上执行, 它是在 20 世纪三十年代引入的一套用于研究函数定义, 函数应用和递归的形式系统.
2. 函数式编程不是用函数来编程, 也不是传统的面向过程编程. 主旨在于将复杂的函数符合成简单的函数(计算理论, 或者递归论, 或者拉姆达演算). 运算过程尽量写成一系列嵌套的函数调用
3.JavaScript 是披着 C 外衣的 Lisp.
4. 真正的火热是随着 React 的高阶函数而逐步升温.
5. 函数是一等公民. 所谓 "第一等公民"(first class), 指的是函数与其他数据类型一样, 处于平等地位, 可以赋值给其他变量, 也可以作为参数, 传入另一个函数, 或者作为别的函数的返回值.
6. 不可改变量. 在函数式编程中, 我们通常理解的变量在函数式编程中也被函数代替了: 在函数式编程中变量仅仅代表某个表达式. 这里所说的'变量'是不能被修改的. 所有的变量只能被赋一次初值.
7.map & reduce 他们是最常用的函数式编程的方法.
将上面的概念简述一下:
1. 函数是 "第一等公民"
2. 只用 "表达式", 不用 "语句"
3. 没有 "副作用"
4. 不修改状态
5. 引用透明(函数运行只靠参数)
二 函数式编程常用核心概念
纯函数
函数的柯里化
函数组合
Point Free
声明式与命令式代码
核心概念
1. 纯函数
什么是纯函数呢?
对于相同的输入, 永远会得到相同的输出, 而且没有任何可观察的副作用, 也不依赖外部环境的状态的函数, 叫做纯函数.
举个栗子:
- var xs = [1,2,3,4,5];// Array.slice 是纯函数, 因为它没有副作用, 对于固定的输入, 输出总是固定的
- xs.slice(0,3);
- xs.slice(0,3);
- xs.splice(0,3);// Array.splice 会对原 array 造成影响, 所以不纯
- xs.splice(0,3);
2. 函数柯里化
传递给函数一部分参数来调用它, 让它返回一个函数去处理剩下的参数.
我们有这样一个函数 checkage:
- var min = 18;
- var checkage = age => age> min;
这个函数并不纯, checkage 不仅取决于 age 还有外部依赖的变量 min. 纯的 checkage 把关键数字 18 硬编码在函数内部, 扩展性比较差, 柯里化优雅的函数式解决.
- var checkage = min => (age => age> min);
- var checkage18 = checkage(18); // 先将 18 作为参数, 去调用此函数, 返回一个函数 age => age> 18;
- checkage18(20);// 第二步, 上面返回的函数去处理剩下的参数, 即 20 => 20> 18; return true;
来源: https://www.cnblogs.com/tjyoung/p/8976013.html