用函数式编程技术编写优美的 JavaScript(zt)
2007-03-21 08:12
691 查看
用函数式编程技术编写优美的 JavaScript |
级别: 初级 Shantanu Bhattacharya (shantanu@justawordaway.com), 首席顾问, Siemens Information Systems Limited 2006 年 7 月 20 日 函数式或声明性编程是非常强大的编程方法,正逐渐在软件行业流行起来。这篇文章将介绍一些相关的函数式编程概念,并提供有效使用这些概念的示例。作者将解释如何使用 JavaScript(TM)™(JavaScript 能导入函数式编程的构造和特性)编写优美的代码。 简介 函数式编程语言在学术领域已经存在相当长一段时间了,但是从历史上看,它们没有丰富的工具和库可供使用。随着 .NET 平台上的 Haskell 的出现,函数式编程变得更加流行。一些传统的编程语言,例如 C++ 和 JavaScript,引入了由函数式编程提供的一些构造和特性。在许多情况下,JavaScript 的重复代码导致了一些拙劣的编码。如果使用函数式编程,就可以避免这些问题。此外,可以利用函数式编程风格编写更加优美的回调。
函数式编程概念,包括匿名函数、调用函数的不同方法,以及将函数作为参数传递给其他函数的方式。 函数式概念的运用,采用的示例包括:扩展数组排序;动态 HTML 生成的优美代码;系列函数的应用。
清单 1. 过程风格的阶乘
清单 2. 函数式风格的阶乘
take n [1..]),然后找出它们的乘积,1 为基元。这个定义与前面的示例不同,没有循环或递归。它就像阶乘函数的算术定义。一旦了解了库函数( take和 foldr)和标记( list notation [ ])的意义,编写代码就很容易,而且可读性也很好。
我现在要讨论 JavaScript 中的函数式构造的各种美妙之处,以及在日常编码和工作中使用它们的方式。我们将从一些基本功能开始,然后用它们查看一些更有趣的应用。 匿名函数 在 JavaScript 中,可以编写匿名函数或没有名称的函数。为什么需要这样的函数?请继续往下读,但首先我们将学习如何编写这样一个函数。如果拥有以下 JavaScript 函数: 清单 3. 典型的函数
清单 4. 匿名函数
清单 5. 应用匿名函数
也可以将函数作为值使用。还可以拥有一些所赋值是函数的变量。在最后一个示例中,还可以执行以下操作: 清单 6. 使用函数赋值
调用函数的不同方法 JavaScript 允许用两种方式调用函数,如清单 7 和 8 所示。 清单 7. 典型的函数应用
清单 8. 用函数作为表达式
清单 9. 定义函数之后就可以立即使用它
将函数作为参数传递给其他函数 也可以将函数作为参数传递给其他函数。虽然这不是什么新概念,但是在后续的示例中大量的使用了这个概念。可以传递函数参数,如 清单 10 所示。 清单 10. 将函数作为参数传递,并应用该函数
使用函数式概念 前一节介绍了一些使用函数式风格的编程概念。所给的示例并没有包含所有的概念,它们在重要性方面也没有先后顺序,只是一些与这个讨论有关的概念而已。下面对 JavaScript 中的函数式风格作一快速总结: 函数并不总是需要名称。 函数可以像其他值一样分配给变量。 函数表达式可以编写并放在括号中,留待以后应用。 函数可以作为参数传递给其他函数。 这一节将介绍一些有效使用这些概念编写优美的 JavaScript 代码的示例。(使用 JavaScript 函数式风格,可以做许多超出这个讨论范围的事。) 扩展数组排序 先来编写一个排序方法,可以根据数组元素的日期对数据进行排序。用 JavaScript 编写这个方法非常简单。数据对象的排序方法接受一个可选参数,这个可选参数就是比较函数。在这里,需要使用 清单 11 中的比较函数。 清单 11. 比较函数
清单 12. 排序函数的扩展
每个 JavaScript 对象都有一个 date 属性。 JavaScript 的数组类型的排序函数接受可选参数,可选参数是用来排序的比较函数。这与 C 库中的 qsort函数类似。 动态生成 HTML 的优美代码 在这个示例中,将看到如何编写优美的代码,从数组动态地生成 HTML。可以根据从数据中得到的值生成表格。或者,也可以用数组的内容生成排序和未排序的列表。也可以生成垂直或水平的菜单项目。 清单 13 中的代码风格通常被用来从数组生成动态 HTML。 清单 13. 生成动态 HTML 的普通代码
清单 14. 生成动态 HTML 的通用方式
Array类型的 prototype 属性定义新函数 fold。现在可以在后面定义的任何数组中使用该函数。 系列函数的应用 考虑以下这种情况:想用一组函数作为回调函数。为实现这一目的,将使用 window.setTimeout函数,该函数有两个参数。第一个参数是在第二个参数表示的毫秒数之后被调用的函数。清单 15 显示了完成此操作的一种方法。 清单 15. 在回调中调用一组函数
清单 16. 调用系列函数的更好的方式
在许多领域中都可以应用 JavaScript 中的函数式编程,以优美的方式完成日常活动。这篇文章中的示例只介绍了几种情况。如果您找到了函数式编程的合适场景,并应用这些概念,那么您就会有更多的理解,并且可以增加您的优美程度。 参考资料 学习 您可以参阅本文在 developerWorks 全球站点上的 英文原文 。 “Functional programming in the Java language: Use closures and higher order functions to write modular Java code”(developerworks,2004 年 7 月):学习如何使用函数式编程构造(例如封装和更高级别的函数),用 Java 语言编写结构良好的模块化的代码。 “Beginning Haskell”(developerWorks,2001 年 9 月):请参阅这份教程,它提供了函数式编程范例的介绍,用 Haskell 98 语言进行了一些特别演示。 Tutorial Papers in Functional Programming:找到与函数式编程有关的一些主题的多个资源。 developerWorks Web 架构专区:利用针对 Web 技术的文章和教程来扩展您的站点开发技能。 developerWorks technical events and webcasts:热切关注最热闹的技术会议,它们可以缩短您的学习曲线、改进最令您头疼的软件项目的质量和结果。 获得产品和技术 免费下载和学习资源:使用来自 developerWorks Web 架构专区的文章、教程和下载改进您的工作。 讨论 参与 developerWorks 讨论组。 developerWorks blogs:加入 developerWorks 社区。 关于作者
|
相关文章推荐
- 用函数式编程技术编写优美的 JavaScript
- 用函数式编程技术编写优美的 JavaScript
- 用函数式编程技术编写优美的 JavaScript_ibm
- 用函数式编程技术编写优美的 JavaScript
- 用函数式编程技术编写优美的 JavaScript
- 用函数式编程技术编写优美的 JavaScript
- 用函数式编程技术编写优美的 JavaScript
- 用函数式编程技术编写优美的 JavaScript_ibm
- 用函数式编程技术编写优美的 JavaScript
- 转贴:用函数式编程技术编写优美的 JavaScript
- [转]用函数式编程技术编写优美的 JavaScript
- 用函数式编程技术编写优美的JavaScript
- 用函数式编程技术编写优美的 JavaScript
- 用函数式编程技术编写优美的 JavaScript
- 用函数式编程技术编写优美的 JavaScript
- 用函数式编程技术编写优美的 JavaScript
- 转:用函数式编程技术编写优美的 JavaScript
- 用函数式编程技术编写优美的 JavaScript_ibm
- 用函数式编程技术编写优美的 JavaScript
- JS函数式编程【译】4.在Javascript中实现函数式编程的技术