概述

函数式编程的核心是在代码中使用众所周知的、可理解的,也已被证明可以避免使代码更难理解的错误的模式。

为什么要函数式编程

信心
函数式编程的程序通常比较少的错误,而且存在的错误通常在一些更明显的地方,因此更容易找到和修复。函数式编程代码趋向于更具防bug性——当然不只是为防代码错误的。
沟通
当您在任何程序中看到“map(…)”时,您几乎可以立即发现并理解它。 但是每次你看到一个“for”循环,你就必须阅读整个循环才能理解它。“for”循环的语法可能是熟悉的,但实际上它所做的并不是;你每次都必须读才能理解。
通过拥有看一眼就能识别的代码的能力,从而减少时间去了解代码在做什么,我们的注意力被释放出来,去思考更高层次的程序逻辑;那些都是最需要我们关注的重要内容。
可读性
客观判断

函数的性质

什么是函数?
函数是可以执行一次或多次的代码集合;确定的输入得到确定的输出
功能与程序
如果您计划进行函数编程,您应该尽可能多地使用函数,并尽可能避免使用过程。所有的“函数”都应该接受输入并返回输出。
函数输入:参数

我们都应该努力实现声明性、自解释的代码。

对于参数的处理使用解构赋值的方式会更好

  1. function foo( {x,y} = {} ) {
  2. console.log( x, y );
  3. }
  4. foo( {
  5. y: 3
  6. } ); // undefined 3

函数输出
对于返回值的处理使用解构赋值的方式会更好

  1. function foo() {
  2. var retValue1 = 11;
  3. var retValue2 = 31;
  4. return [ retValue1, retValue2 ];
  5. }
  6. var [ x, y ] = foo();
  7. console.log( x + y ); // 42

关于提前返回的注意点
应该注意“返回”的流控制部分,它在函数定义中创建了更多的含义。试着找出最明确的表达逻辑的方法,这通常是最好的方法。

  1. // bad code
  2. function foo(x) {
  3. if (x > 10) return x + 1;
  4. var y = x / 2;
  5. if (y > 3) {
  6. if (x % 2 == 0) return x;
  7. }
  8. if (y > 1) return y;
  9. return x;
  10. }
  11. // good code
  12. function foo(x) {
  13. var retValue;
  14. if (retValue == undefined && x > 10) {
  15. retValue = x + 1;
  16. }
  17. var y = x / 2;
  18. if (y > 3) {
  19. if (retValue == undefined && x % 2 == 0) {
  20. retValue = x;
  21. }
  22. }
  23. if (retValue == undefined && y > 1) {
  24. retValue = y;
  25. }
  26. if (retValue == undefined) {
  27. retValue = x;
  28. }
  29. return retValue;
  30. }

函数的功能
接收或返回一个或多个其他函数值的函数具有特殊名称:高阶函数。
作用域的保持
当内部函数引用外部函数中的变量时,这称为闭包。
实用性的定义:

闭包是指当一个函数从它自己的作用域之外记住和访问变量时,即使这个函数是在另一个作用域中执行的。

闭包启用的访问不仅限于读取变量的原始值——它不仅仅是一个快照,而是一个活动链接。您可以更新该值,并且新的状态将一直保留到下一次访问:

  1. function runningCounter(start) {
  2. var val = start;
  3. return function current(increment = 1){
  4. val = val + increment;
  5. return val;
  6. };
  7. }
  8. var score = runningCounter( 0 );
  9. score(); // 1
  10. score(); // 2
  11. score( 13 ); // 15

匿名函数
为了堆栈跟踪调试、可靠的自引用和可读性,你需要为匿名函数添加名称。
箭头函数
建议支持’ => ‘的论据是,通过使用更轻量级的语法,我们减少了函数之间的视觉边界,这使得我们可以使用简单的函数表达式,就像我们使用延迟表达式一样。
‘ => ‘箭头函数的匿名性就像一把’ => ‘匕首刺向心脏。它在词法上失去名字,更难读,更难调试,也不可能自我引用。

管理函数输入

参考

【1】GitHub - Simingchen/Functional-Light-JS: JavaScript轻量级函数式编程(中文翻译)