您的位置:首页 > Web前端 > JavaScript

JavaScript中的函数式编程实践(1)

2010-10-30 19:15 316 查看

JavaScript中的函数式编程实践(1)

http://developer.51cto.com 2010-06-22 13:32 Bhattacharya IBM 我要评论(0)

在这篇文章中,您将了解一些关于如何采用函数式风格,用JavaScript编写良好的、优美的代码的示例,包括函数式编程概念以及函数式概念的运用。

函数式编程语言在学术领域已经存在相当长一段时间了,但是从历史上看,它们没有丰富的工具和库可供使用。随着.NET平台上的Haskell和F#函数式编程语言的出现,其变得更加流行。一些传统的编程语言,例如C++和JavaScript,也引入了由函数式编程提供的一些构造和特性。
51CTO推荐专题:JavaScript函数式编程
在许多情况下,JavaScript的重复代码导致了一些拙劣的编码。如果使用函数式编程,就可以避免这些问题。此外,可以利用函数式编程风格编写更加优美的回调。因为函数式编程采用了完全不同的组织程序的方式,所以那些习惯于采用命令式范例的程序员可能会发现函数式编程有点难学。
函数式编程概念
在那些通过描述“如何做”指定解决问题的方法的语言中,许多开发人员都知道如何进行编码。例如,要编写一个计算阶乘的函数,我可以编写一个循环来描述程序,或者使用递归来查找所有数字的乘积。在这两种情况下,计算的过程都在程序中进行了详细说明。清单1显示了一个计算阶乘的可能使用的C代码。
清单 1. 过程风格的阶乘  int factorial (int n)  {    if (n <= 0)      return 1;    else      return n * factorial (n-1);  }

这类语言也叫做过程性编程语言,因为它们定义了解决问题的过程。函数式编程与这个原理有显著不同。在函数式编程中,需要描述问题“是什么”。 函数式编程语言又叫做声明性语言。同样的计算阶乘的程序可以写成所有到n的数字的乘积。计算阶乘的典型函数式程序看起来如清单2中的示例所示。
清单 2. 函数式风格的阶乘  factorial n, where n <= 0  := 1 factorial n    := foldr * 1 take n [1..]

第二个语句指明要得到从1开始的前n个数字的列表(take n [1..]),然后找出它们的乘积,1 为基元。这个定义与前面的示例不同,没有循环或递归。它就像阶乘函数的算术定义。一旦了解了库函数(take 和 foldr)和标记(list notation [ ])的意义,编写代码就很容易,而且可读性也很好。只用三行Miranda代码就可以编写例程,根据参数,使用广度优先或深度优先遍历处理n叉树的每个节点,而且元素可以是任何通用类型。

从历史上看,函数式编程语言不太流行有各种原因。但是最近,有些函数式编程语言正在进入计算机行业。其中一个例子就是.NET平台上的Haskell。其他情况下,现有的一些语言借用了函数式编程语言中的一些概念。
一些C++实现中的迭代器和continuation,以及JavaScript中提供的一些函数式构造(functional construct),就是这种借用的示例。但是,通过借用函数式构造,总的语言编程范例并没有发生变化。JavaScript并没因为函数式构造的添加就变成了函数式编程语言。
这里我们主要讨论了JavaScript中的函数式构造的各种美妙之处,以及在日常编码和工作中使用它们的方式。我们将从一些基本功能开始,然后用它们查看一些更有趣的应用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: