函数式编程是一种编程范式,常见的编程范式有如下三种:html
函数式编程的本质是将计算描述为一种表达式求值。在函数式编程中,函数做为一等公民,能够在任何地方定义(在函数内或函数外),能够做为函数的参数和返回值,能够对函数进行组合。git
函数式编程的准则:不依赖于外部的数据,并且也不改变外部数据的值,而是返回一个新的值给你。看个简单的例子:web
// 非函数式的例子 let count = 0; function increment() { count++; // 依赖于函数外部的值,并改变了它的值 } // 函数式的例子 function increment(count) { return count++; }
函数式编程不依赖外部的状态也不修改外部的状态,函数调用的结果不依赖调用的时间和位置,这些写代码容易进行推理,不易犯错,并且单测和调试都更简单。即函数编程采用纯函数。shell
纯函数是这样一种函数,即相同的输入,永远会获得相同的输出,并且没有任何可观察的反作用。
反作用可能包含,但不限于:数据库
反作用是在计算结果的过程当中,系统状态的一种变化,或者与外部世界进行的可观察的交互。
纯函数的好处:编程
纯函数能根据输入来作缓存(memoize技术)设计模式
const memoize = function(f) { const cache = {}; return function() { const argStr = JSON.stringify(arguments); if (!cache[argStr]) { cache[argStr] = f.apply(f, arguments); } return cache[argStr]; } }
可移植性/自文档化
纯函数的输出只依赖与它的输入,依赖很明确,易于理解。因为纯函数不依赖它的上下文环境,所以咱们能够轻易的把它移植到任何地方运行它。浏览器
可测试性
咱们没必要在每次测试前都去配置和构造初始环境,只需简单给函数一个输入,而后断言它的输出就行了。缓存
合理性
因为纯函数老是可以根据相同的输入返回相同的输出,因此它们就可以保证老是返回同一个结果,这也就保证了引用透明性。并发
并行执行
咱们能够并行运行任意纯函数。由于纯函数根本不须要访问共享的内存,并且根据其定义,纯函数也不会因反作用而进入竞争态。
并行代码在服务端 js 环境以及使用了 web worker 的浏览器那里是很是容易实现的,由于它们使用了线程(thread)。不过出于对非纯函数复杂度的考虑,当前主流观点仍是避免使用这种并行。
这里咱们先不展开这些技术的细节内容,本文咱们先侧重于对函数式编程有一个总体上的认识,具体的技术细节咱们将在下一章展开。
咱们先来看如下几种观点:
我想说的是这种偏激的观点是不正确的,咱们不该该把函数式编程和命令式编程对立起来,咱们更多的时候须要考虑的是技术的适用场景。函数式编程写起代码来,有必定的难度,若是一个团队的总体水平达不到,那么写代码的质量和效率还不如采用命令式编程好。函数式编程利用纯函数的无状态性,它的好处很是多(结果可预期、利于测试、利于复用、利于并发),但一个系统工程的代码,是不可能所有采用纯函数来写的。当咱们越贴近业务,咱们就离纯函数与无状态越远。
函数式编程很是重要,学习它咱们能打开咱们的思惟方式,使用它也有不少好处,但它也有一些局限,咱们应该客观看待。保持开放的心态,根据实际场景选择合适的技术,是一个工程师基本的素养。
https://llh911001.gitbooks.io...
http://www.ruanyifeng.com/blo...
https://coolshell.cn/articles...
https://www.zhihu.com/questio...
https://zhuanlan.zhihu.com/p/...