函数式编程让JS更优美(2)

来源:冷雨幽森 时间:2008-06-10 12:40:00 

使用函数式概念

前一节介绍了一些使用函数式风格的编程概念。所给的示例并没有包含所有的概念,它们在重要性方面也没有先后顺序,只是一些与这个讨论有关的概念而已。下面对 JavaScript 中的函数式风格作一快速总结:
函数并不总是需要名称。
函数可以像其他值一样分配给变量。
函数表达式可以编写并放在括号中,留待以后应用。
函数可以作为参数传递给其他函数。

这一节将介绍一些有效使用这些概念编写优美的 JavaScript 代码的示例。(使用 JavaScript 函数式风格,可以做许多超出这个讨论范围的事。)

扩展数组排序

先来编写一个排序方法,可以根据数组元素的日期对数据进行排序。用 JavaScript 编写这个方法非常简单。数据对象的排序方法接受一个可选参数,这个可选参数就是比较函数。在这里,需要使用 清单 11 中的比较函数。

比较函数

程序代码 程序代码

function (x,y) {
        return x.date – y.date;
}

要得到需要的函数,请使用 清单 12 的示例。

排序函数的扩展

程序代码 程序代码

arr.sort( function (x,y) {        return x.date – y.date; } );

其中 arr 是类型数组对象。排序函数会根据 arr 数组中对象的日期对所有对象进行排序。比较函数和它的定义一起被传递给排序函数,以完成排序操作。使用这个函数:

每个 JavaScript 对象都有一个 date 属性。

JavaScript 的数组类型的排序函数接受可选参数,可选参数是用来排序的比较函数。这与 C 库中的 qsort 函数类似。

动态生成 HTML 的优美代码

在这个示例中,将看到如何编写优美的代码,从数组动态地生成 HTML。可以根据从数据中得到的值生成表格。或者,也可以用数组的内容生成排序和未排序的列表。也可以生成垂直或水平的菜单项目。

生成动态 HTML 的普通代码

程序代码 程序代码

var str=' ';
for (var i=0;i<arr.length;i++) {
  var element=arr[i];
  str+=... HTML generation code...
}
document.write(str);

程序代码 程序代码

生成动态 HTML 的通用方式

程序代码 程序代码

Array.prototype.fold=function(templateFn) {
  var len=this.length;
  var str=' ';
  for (var i=0 ; i<len ; i++)
        str+=templateFn(this[i]);
  return str;
}
function templateInstance(element) {
  return ... HTML generation code ...
}
document.write(arr.fold(templateInstance));

我使用 Array 类型的 prototype 属性定义新函数 fold。现在可以在后面定义的任何数组中使用该函数。

系列函数的应用

考虑以下这种情况:想用一组函数作为回调函数。为实现这一目的,将使用 window.setTimeout 函数,该函数有两个参数。第一个参数是在第二个参数表示的毫秒数之后被调用的函数。清单 15 显示了完成此操作的一种方法。
程序代码 程序代码

window.setTimeout(function(){alert(‘First!’);alert(‘Second!’);}, 5000);

调用系列函数的更好的方式

程序代码 程序代码

Function.prototype.sequence=function(g) {
  var f=this;
  return function() {
    f();g();
  }
};
function alertFrst() { alert(‘First!’); }
function alertSec() { alert(‘Second!’); }
setTimeout( alertFrst.sequence(alertSec), 5000);


    在处理事件时,如果想在调用完一个回调之后再调用一个回调,也可以使用 清单 16 中的代码扩展。这可能是一个需要您自行完成的一个练习,现在您的兴趣被点燃了吧。

标签:函数,编程,js
0
投稿

猜你喜欢

  • Web性能优化系列 10个提升JavaScript性能的技巧

    2024-05-28 15:40:37
  • javascript操作ASP.NET服务器控件

    2023-07-21 15:09:26
  • mysql中left join设置条件在on与where时的用法区别分析

    2024-01-12 15:05:52
  • Python文件操作的方法

    2022-10-27 19:54:29
  • mysql按照时间分组查询的语句

    2024-01-20 05:39:24
  • 汉明码编码原理及校验方法分析

    2022-10-09 06:38:13
  • IE对CSS样式表的限制和解决方案

    2008-04-28 12:27:00
  • 运用Python巧妙处理Word文档的方法详解

    2023-11-13 16:58:29
  • 新兴XML处理方法VTD-XML介绍

    2008-09-04 14:42:00
  • OpenCV+python实现实时目标检测功能

    2023-11-03 01:59:35
  • 删除数组中重复项(uniq)

    2009-12-28 12:23:00
  • Python学习之名字,作用域,名字空间(下)

    2021-04-28 05:45:20
  • 浅谈js的html元素的父节点,子节点

    2024-04-23 09:31:56
  • Python 使用Opencv实现目标检测与识别的示例代码

    2023-01-23 17:46:11
  • Selenium元素定位的30种方式(史上最全)

    2023-11-13 17:03:41
  • MySQL sql_mode的使用详解

    2024-01-16 00:13:59
  • 通过底层源码理解YOLOv5的Backbone

    2023-07-15 20:37:01
  • matplotlib 纵坐标轴显示数据值的实例

    2021-10-02 12:55:43
  • Python的@property的使用

    2021-03-27 11:02:25
  • js格式化金额可选是否带千分位以及保留精度

    2023-10-06 04:03:14
  • asp之家 网络编程 m.aspxhome.com