Javascript函数式编程

函数式编程:通过使用函数将值转换成抽象的单元,接着用于构建软件系统(拆分再组装),也就是不断地用已有函数, 来组合出新的函数。
面向对象编程主要目标是问题分解,函数式编程也会将一个问题分成几个函数来解决。高阶函数即以一个函数作为参数或返回一个函数作为结果
函数式编程包涵以下技术:
1、确定抽象,并为其构建函数
2、利用已有的函数构建更为复杂的抽象
3、通过将现有的函数传递给其他的函数来构建更为复杂的抽象
UnderscoreJS是一个JavaScript实用库,提供了一整套函数式编程的实用功能,但是没有扩展任何JavaScript内置对象。“如果我在一个空白的HTML页面前坐下, 并希望立即开始工作, 我需要什么?“...它弥补了部分jQuery没有实现的功能,同时又是Backbone.js必不可少的部分。Underscore提供了100多个函数,包括常用的: map, filter, invoke ,当然还有更多专业的辅助函数,如:函数绑定, JavaScript模板功能,创建快速索引, 强类型相等测试, 等等.
//过程风格的阶乘            
int factorial (int n)
{
  if (n <= 0)
    return 1;
  else
    return n * factorial (n-1);
}

这类语言也叫做过程性 编程语言,因为它们定义了解决问题的过程。函数式编程与这个原理有显著不同。在函数式编程中,需要描述问题 “是什么”。函数式编程语言又叫做声明性语言。同样的计算阶乘的程序可以写成所有到 n 的数字的乘积。

//函数式风格的阶乘                    
factorial n, where n <= 0    := 1
factorial n    := foldr * 1 take n [1..]

第二个语句指明要得到从 1 开始的前 n 个数字的列表(take n [1..]),然后找出它们的乘积,1 为基元。这个定义与前面的示例不同,没有循环或递归。它就像阶乘函数的算术定义。一旦了解了库函数(take 和 foldr)和标记(list notation [ ])的意义,编写代码就很容易,而且可读性也很好。

函数式编程具有五个鲜明的特点:

1. 函数是"第一等公民":指的是函数与其他数据类型一样,处于平等地位

2. 只用"表达式",不用"语句"

"表达式"(expression)是一个单纯的运算过程,总是有返回值;

"语句"(statement)是执行某种操作,没有返回值。

3. 没有"副作用"

指的是函数内部与外部互动(最典型的情况,就是修改全局变量的值),产生运算以外的其他结果。

4. 不修改状态

变量往往用来保存"状态"(state)。不修改变量,意味着状态不能保存在变量中,函数式编程使用参数保存状态

5. 引用透明

指的是函数的运行不依赖于外部变量或"状态",只依赖于输入的参数,任何时候只要参数相同,引用函数所得到的返回值总是相同的

 // 阶乘的一般实现  (过程式编程)
 function factorial(n) {  
   if (n == 1) {  
     return 1;  
   } else {  
     return factorial(n - 1) * n;  
   }  
 }  
   
 // 阶乘的函数式编程风格实现  
 function mul(a, b){  return a*b; }   
 function dec(x){  return x - 1; }   
 function equal(a, b){  return a==b; }      
 function factorial(n) {  
   if (equal(n, 1)) {  
     return 1;  
   } else {  
     return mul(n, factorial(dec(n)));  
   }  
}  
原文地址:https://www.cnblogs.com/chenlogin/p/6372019.html