JavaScript的函数式编程特性
?
首先说说什么事“函数式编程”,借用维基百科的概念:
函数式编程是种编程范型,它将电脑运算视为函数的计算。函数式编程的重点是函数的定义而不是像命令式编程那样强调状态机(state machine)的实现。
也就是说,函数式编程只描述在程序输入上执行的操作,重点是捕捉 “是什么以及为什么”,而不是 “如何做”,我们只需知道一个函数能返回什么样的结果,然后将结果用于进一步的运算。
有一个容易误解的概念是——“函数式编程就是一堆函数”,这是错误的。并不是一个语言支持函数,这个语言就可以叫做 “ 函数式语言 ” 。函数式语言中的 “ 函数( funct ion ) ” 除了能被调用之外,还具有一些其它的性质:
- 函数是运算元
- 在函数内保存数据
- 函数内的运算对函数外无副作用
?
说回JavaScript,其实JavaScript并不是一个函数式编程语言,只能说它的实现参照了些函数式编程的特性,是个“半函数式编程语言”。下面我就介绍下JavaScript中函数式编程的一些特性吧。
?
一、函数(Function)是一等公民
Function是JavaScript中最基础的模块,本身为一种特殊对象(Object),属于顶层对象,不依赖于任何其他的对象而可以独立存在,而在面向对象的语言中,Function是依附于对象的,属于对象的一部分。JavaScript中一切皆是对象,那Function自然也是对象,换个角度说,一切皆是可传入Function的值,连Function本身也不例外。
这样有什么好处?举一个排序的例子:
});其实原理就是在函数最后return this,即可接着之前的上下文环境继续调用函数,这样很爽吧!
?
七、函数内的运算对函数外无副作用
其实,这并不是JavaScript的一个特性,这是函数式语言应当达到的一种特性,在 JavaScr ipt 中这项特性只能通过开发人员的编程习惯来保证。
所谓对函数外无副作用,含义在于:
- 函数使用入口参数进行运算,而不修改它(作为值参数而不是变量参数使用)
- 在运算过程中不会修改函数外部的其它数据的值(例如全部变量)
- 运算结束后通过函数返回向外部系统传值。
这样有啥好处呢?
没有函数修改过在其作用域之外的量并被其他函数使用(如类成员或全局变量)——这意味着函数求值的结果只是其返回值,而惟一影响其返回值的就是函数的参数。
如果一个函数式程序不如你期望地运行,调试是轻而易举的。因为函数式程序的 bug 不依赖于执行前与其无关的代码路径,你遇到的问题就总是可以再现。在单元测试中,你只需在意其参数,而不必考虑函数调用顺序,不用谨慎地设置外部状态。所有要做的就是传递代表了边际情况的参数。如果程序中的每个函数都通过了单元测试,你就对这个软件的质量有了相当的自信。
而命令式编程就不能这样乐观了,在 Java 或 C++ 中只检查函数的返回值还不够——我们还必须验证这个函数可能修改了的外部状态。
这种特性其实也是程序“高内聚,低耦合”的一种体现,在实际开发中应当尽量遵从。
?
我的博客:http://technicolor.flycoder.org/articles/793.html