函数式编程:通过使用函数将值转换成抽象的单元,接着用于构建软件系统(拆分再组装),也就是不断地用已有函数, 来组合出新的函数。
面向对象编程主要目标是问题分解,函数式编程也会将一个问题分成几个函数来解决。高阶函数即以一个函数作为参数或返回一个函数作为结果
函数式编程包涵以下技术:
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))); } }