前言

因为想弥补一下自己对一些函数式编程的了解和体会,所以特意找了一些资料来阅读~以下的感想是来自于这本书哒:

《JS 函数式编程指南》
作者: Franklin Risby for his great work!
地址:https://legacy.gitbook.com/bo...

什么是纯函数

纯函数就是保证输入和对应的输出是相同的函数,也就类似于我们课本中学的函数的概念!一个x永远只对应一个y值。

比如,js中存在的会改变原数组的一些数组操作函数,这些就是不纯的。
主要是有共享的变量和成员,比如全局变量之类的。

纯的好处

  • 可缓存性(Cacheable)
  • 可移植性/自文档化(Portable / Self-Documenting)
  • 可测试性(Testable)
  • 合理性(Reasonable)
  • 并行代码

对于可缓存性,有下面这段“通用”的代码,提取一次(即计算)就缓存一次,后面取的时候就不用重新计算了:

var memoize = function(f) {
  var cache = {};

  return function() {
    var arg_str = JSON.stringify(arguments);
    cache[arg_str] = cache[arg_str] || f.apply(f, arguments);
    return cache[arg_str];
  };
};

而如果函数是不纯的话,我们并不能靠输入的值来提取出唯一对应的结果,因为它可能有多种情况。

可移植性

可移植性可以意味着把函数序列化(serializing)并通过 socket 发送。也可以意味着代码能够在 web workers
中运行。总之,可移植性是一个非常强大的特性。

自文档化是说把需要的数据都写在参数里,不写成比如对象的形式,因为对象的属性可以在外面被修改所以可能会造成不一样的结果。
而把参数都列出来,这样使用者也知道它需要什么数据,也就是像有文档一样告诉你。

可测试性
我们很多情况下都是要测试某一个函数或者某一个部分,如果这个函数依赖一些全局的东西,我们在设置断点的时候涵盖的范围就会很大,所以这样会影响我们的测试。而纯函数可以让我们只专注于这一个函数。

断言:表示为一些布尔表达式,程序员相信在程序中的某个特定点该表达式值为真,可以在任何时候启用和禁用断言验证,因此可以在测试时启用断言而在部署时禁用断言。同样,程序投入运行后,最终用户在遇到问题时可以重新启用断言。

合理性

如果一段代码可以替换成它执行所得的结果,而且是在不改变整个程序行为的前提下替换的,那么我们就说这段代码是引用透明的。
我们可以使用一种叫做“等式推导”(equational
reasoning)的技术来分析代码。所谓“等式推导”就是“一对一”替换,有点像在不考虑程序性执行的怪异行为(quirks of
programmatic evaluation)的情况下,手动执行相关代码。

最后一个并行代码,就是说可以并行运行任意纯函数。因他们不需要访问共享的内存,也不会因副作用而进入竞争状态。


MOCHIKO
318 声望29 粉丝