JavaScript 函数式编程笔记
《JavaScript ES6 函数式编程入门经典》笔记
《JavaScript ES6 函数式编程入门经典》-Anto Aravinth-清华大学出版社
Chapter 1
数学中如何定义函数?
- 接收参数;
- 返回值;
- 依据参数而非外部环境运行;
- 输入对应唯一输出;
如何进行函数式编程?
-
编写纯函数,避免使函数功能依赖于全局变量;
- 使用参数传递
-
使用声明式而非命令式编程,
前者告诉编译器做什么,而不是如何做、后者告诉编译器如何做;
- 例如:for循环与
forEach
方法
- 例如:for循环与
-
组合功能单一的纯函数——函数式组合(Functional Composition);
函数式编程的好处?
大多来自于编写纯函数
- 更加容易测试;
- 可以缓存结果;
- 没有并发困扰;
纯函数是什么?
- 不改变任何外部环境变量;
- 我们不需要了解
Math.max(2,3,4)
的内部细节,便能给出结果,这就是纯函数的魅力; - 实际上,命令也是一种纯函数,接收参数、返回输出,不改变外部环境;
- 纯函数应该被设计为只做一件事;
两个重要的概念/特点
- 引用透明性(Referential Transparency):相同输入返回相同值;
- 来自分析哲学,用另一个引用相同实体的词语替换上下文的词语,不会改变句子含义。
- 替换模型(Substitution Model):因为每个输入只对应一个特定结果,因此可以直接用函数结果替换函数表达式,这个过程就是替换模型;
一些启发性观点
-
同步的问题是由并发运行时共享全局变量导致的;
- 这里也有问题,同步访问全局变量的需求能完全被参数传递替代吗?
-
UNIX 中,通过将单一命令组合完成复杂任务
cat jsBook | grep -i "composing" | wc
Last modified on 2020-04-30