




免费预览已结束,剩余1页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
JavaScript中的函数式编程实践函数式编程语言在学术领域已经存在相当长一段时间了,但是从历史上看,它们没有丰富的工具和库可供使用。随着.NET平台上的Haskell和F#函数式编程语言的出现,其变得更加流行。一些传统的编程语言,例如C+和JavaScript,也引入了由函数式编程提供的一些构造和特性。在许多情况下,JavaScript的重复代码导致了一些拙劣的编码。如果使用函数式编程,就可以避免这些问题。此外,可以利用函数式编程风格编写更加优美的回调。因为函数式编程采用了完全不同的组织程序的方式,所以那些习惯于采用命令式范例的程序员可能会发现函数式编程有点难学。函数式编程概念在那些通过描述“如何做”指定解决问题的方法的语言中,许多开发人员都知道如何进行编码。例如,要编写一个计算阶乘的函数,我可以编写一个循环来描述程序,或者使用递归来查找所有数字的乘积。在这两种情况下,计算的过程都在程序中进行了详细说明。清单1显示了一个计算阶乘的可能使用的C代码。1. 清单1.过程风格的阶乘 2. intfactorial(intn) 3. 4. if(n=0) 5. return1; 6. else 7. returnn*factorial(n-1); 8. 这类语言也叫做过程性编程语言,因为它们定义了解决问题的过程。函数式编程与这个原理有显著不同。在函数式编程中,需要描述问题“是什么”。 函数式编程语言又叫做声明性语言。同样的计算阶乘的程序可以写成所有到n的数字的乘积。计算阶乘的典型函数式程序看起来如清单2中的示例所示。9. 清单2.函数式风格的阶乘 10. factorialn,wheren=0:=111. factorialn:=foldr*1taken1.第二个语句指明要得到从1开始的前n个数字的列表(take n 1.),然后找出它们的乘积,1 为基元。这个定义与前面的示例不同,没有循环或递归。它就像阶乘函数的算术定义。一旦了解了库函数(take 和 foldr)和标记(list notation )的意义,编写代码就很容易,而且可读性也很好。只用三行Miranda代码就可以编写例程,根据参数,使用广度优先或深度优先遍历处理n叉树的每个节点,而且元素可以是任何通用类型。 从历史上看,函数式编程语言不太流行有各种原因。但是最近,有些函数式编程语言正在进入计算机行业。其中一个例子就是.NET平台上的Haskell。其他情况下,现有的一些语言借用了函数式编程语言中的一些概念。一些C+实现中的迭代器和continuation,以及JavaScript中提供的一些函数式构造(functional construct),就是这种借用的示例。但是,通过借用函数式构造,总的语言编程范例并没有发生变化。JavaScript并没因为函数式构造的添加就变成了函数式编程语言。这里我们主要讨论了JavaScript中的函数式构造的各种美妙之处,以及在日常编码和工作中使用它们的方式。我们将从一些基本功能开始,然后用它们查看一些更有趣的应用。匿名函数在JavaScript中,可以编写匿名函数或没有名称的函数。为什么需要这样的函数?请继续往下读,但首先我们将学习如何编写这样一个函数。如果拥有以下JavaScript 函数:1. 清单3.典型的函数 2. functionsum(x,y,z) 3. return(x+y+z); 4. 然后对应的匿名函数看起来应当如下所示:5. 清单4.匿名函数 6. function(x,y,z) 7. return(x+y+z); 8. 要使用它,则需要编写以下代码:9. 清单5.应用匿名函数 10. varsum=function(x,y,z) 11. return(x+y+z); 12. (1,2,3); 13. alert(sum);使用函数作为值也可以将函数作为值使用。还可以拥有一些所赋值是函数的变量。在最后一个示例中,还可以执行以下操作:14. 清单6.使用函数赋值 15. varsum=function(x,y,z) 16. return(x+y+z); 17. 18. alert(sum(1,2,3);在上面清单6的示例中,为变量sum赋的值是函数定义本身。这样,sum就成了一个函数,可以在任何地方调用。调用函数的不同方法JavaScript允许用两种方式调用函数,如清单7和8所示。19. 清单7.典型的函数应用 20. alert(“Hello,World!); 21. 或 22. 清单8.用函数作为表达式 23. (alert)(“Hello,World!);所以也可以编写以下代码:24. 清单9.定义函数之后就可以立即使用它 25. (function(x,y,z)return(x+y+z)(1,2,3);可以在括号中编写函数表达式,然后传递给参数,对参数进行运算。虽然在清单8的示例中,有直接包含在括号中的函数名称,但是按清单9中所示方式使用它时,就不是这样了。将函数作为参数传递给其他函数也可以将函数作为参数传递给其他函数。虽然这不是什么新概念,但是在后续的示例中大量的使用了这个概念。可以传递函数参数,如清单10所示。1. 清单10.将函数作为参数传递,并应用该函数 2. varpassFunAndApply=function(fn,x,y,z)returnfn(x,y,z); 3. varsum=function(x,y,z) 4. returnx+y+z; 5. ; 6. alert(passFunAndApply(sum,3,4,5);/12执行最后一个alert语句输出了一个大小为12的值。使用函数式概念前一节介绍了一些使用函数式风格的编程概念。所给的示例并没有包含所有的概念,它们在重要性方面也没有先后顺序,只是一些与这个讨论有关的概念而已。下面对JavaScript中的函数式风格作一快速总结:函数并不总是需要名称;函数可以像其他值一样分配给变量;函数表达式可以编写并放在括号中,留待以后应用;函数可以作为参数传递给其他函数。这一节将介绍一些有效使用这些概念编写优美的JavaScript代码的示例。扩展数组排序 先来编写一个排序方法,可以根据数组元素的日期对数据进行排序。用JavaScript编写这个方法非常简单。数据对象的排序方法接受一个可选参数,这个可选参数就是比较函数。在这里,需要使用清单11中的比较函数。7. 清单11.比较函数 8. function(x,y) 9. returnx.datey.date; 10. 要得到需要的函数,请使用清单12的示例。11. 清单12.排序函数的扩展 12. arr.sort(function(x,y)returnx.datey.date;);其中 arr 是类型数组对象。排序函数会根据arr数组中对象的日期对所有对象进行排序。比较函数和它的定义一起被传递给排序函数,以完成排序操作。使用这个函数:每个JavaScript对象都有一个date属性。JavaScript的数组类型的排序函数接受可选参数,可选参数是用来排序的比较函数。这与C库中的qsort函数类似。动态生成HTML的优美代码 在这个示例中,将看到如何编写优美的代码,从数组动态地生成HTML。可以根据从数据中得到的值生成表格。或者,也可以用数组的内容生成排序和未排序的列表。也可以生成垂直或水平的菜单项目。清单13中的代码风格通常被用来从数组生成动态HTML。13. 清单13.生成动态HTML的普通代码 14. varstr=; 15. for(vari=0;iarr.length;i+) 16. varelement=arri; 17. str+=.HTMLgenerationcode. 18. 19. document.write(str);可以用清单14的代码替换这个代码。20. 清单14.生成动态HTML的通用方式 21. Atotype.fold=function(templateFn) 22. varlen=this.length; 23. varstr=; 24. for(vari=0;ilen;i+) 25. str+=templateFn(thisi); 26. returnstr; 27. 28. 29. functiontemplateInstance(element) 30. return.HTMLgenerationcode. 31. 32. 33. document.write(arr.fold(templateInstance);这里使用的是Array类型的prototype属性定义新函数fold。现在可以在后面定义的任何数组中使用该函数。系列函数的应用 考虑以下这种情况:想用一组函数作为回调函数。为实现这一目的,将使用window.setTimeout函数,该函数有两个参数。第一个参数是在第二个参数表示的毫秒数之后被调用的函数。清单15显示了完成此操作的一种方法。1. 清单15.在回调中调用一组函数 2. window.setTimeout(function()alert(First!);alert(Second!);,5000);清单16显示了完成此操作的更好的方式。3. 清单16.调用系列函数的更好的方式 4. Ftotype.sequence=function(g) 5. varf=this; 6. returnfunction() 7. f();g(); 8. 9. ; 10. functionalertFrst()alert(First!); 11. functionalertSec()alert(Second!); 12. setTimeout(alertFrst
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 荆门市中石油2025秋招笔试模拟题含答案行测综合英语
- 中国广电银川市2025秋招财务审计类专业追问清单及参考回答
- 陕西地区中石化2025秋招笔试模拟题含答案安全环保与HSE岗
- 阿里市中储粮2025秋招面试专业追问题库综合管理岗
- 中国广电蚌埠市2025秋招行业解决方案岗位专业追问清单及参考回答
- 本溪市中石油2025秋招面试半结构化模拟题及答案新材料与新能源岗
- 焦作市中储粮2025秋招面试专业追问题库综合管理岗
- 宝鸡市中石化2025秋招笔试行测50题速记
- 哈密市中石油2025秋招笔试行测专练题库及答案
- 中国移动儋州市2025秋招笔试行测题库及答案供应链采购类
- 国庆中秋双节安全培训课件
- 2025年全国青少年全国禁毒知识竞赛试题及答案
- 云南学法减分题库及答案
- 幼儿园大班数学活动《4的分解与组合》课件
- 2025秋七年级开学新生家长会《启幕新篇章携手创辉煌》【课件】
- GJB3243A-2021电子元器件表面安装要求
- 2025年《数字孪生与虚拟调试技术应用》课程标准
- 生物●安徽卷丨2024年安徽省普通高中学业水平选择性考试生物试卷及答案
- 蓝牙耳机委托加工协议书
- 北京车牌出租协议书
- TCCEAS001-2022建设项目工程总承包计价规范
评论
0/150
提交评论