有哪些函数式编程在前端编程工具的实践经验

C++函数式编程(三)纯正度实践
C++函数式编程(三)纯正度实践
函数式编程
作者:John Carmack
-2013年1月
-/panhong101
并非所有程序都是纯正的,除非该程序只和自身代码打交道,而程序多数情况下也需要和外界交互。虽然探险般地将纯正做到极致是一种乐趣,但实际情况也表明:有时候,副作用也是必要的,应该好好管理这些副作用。
在有些函数中,纯与不纯并不是绝对的。函数的纯正度是一个连续值,从“几乎纯正”到“完全纯正”带来的价值要小于从“混乱状态”到“几乎纯正”的价值。把函数朝纯函数的方向改进,就算没有让它变成“完全纯正”,代码也会有所改善。一个函数,如果它累加一个全局计数器,或者检查一个全局调试标识,都不能算是纯函数。不过即使这样,如果它实际只可能做上面两个事,也会获得大多数纯函数的优势。
有些情况下,在容忍范围内避免最差,比达到完美更重要。想想你曾经处理过的毒害性最严重的函数或者系统,严重到你得戴个面罩,拿个钳子才敢去碰。这种系统必然是状态错综复杂,数据状态依赖性强的——绝不仅仅依赖于它的参数。对这些问题采取一定措施,或者至少努力避免更多代码陷入这种境况,比让几个底层数学函数更简洁,有意义得多。
重构函数以使其纯正,主要应从其操作上下文着手,增加更多的参数传递是不二法门。这么说似乎让人觉得奇怪,本来编程语言是以简为美,而函数式编程经常是降低代码量的。有些因素使函数式程序有时候比命令式程序更简洁,它们包括:垃圾回收、强大的内建类型、模式匹配、列表解析、函数合成、各种语法糖等等,而这些因素往往和函数式编程是排斥的。大多数情况下,代码量的减少和函数式编程没太大关系,命令式程序也能够做到。
如果得给一个函数传一大堆参数,估计你得烦死。此时你可以将程序重构一下,减少些参数。
对于C++来说,缺乏一个保持函数纯正度的语言机制略显逊色。如果真有个家伙把一个被大量使用的基础纯函数,以某种不够光彩的方式,改成不纯的了,那么所有调用该函数的其它函数,也都不纯了。从形式系统的角度来看,这简直就是场灾难,但还是那句话,也没那么绝对,死罪可免,活罪难逃。但对于大规模软件开发,情况则只具有统计学意义,很遗憾。
谈了这么多,似乎给以后的C/C++语言标准增加一个pure关键字是比较明智的。它应该和关键字const有相似之处:都是可选修饰符,都在编译期检测用户代码,都对代码百利无一害。D语言就提供了pure关键字()。注意D语言里有弱纯正和强纯正之分,强纯正要求给函数的引用或者指针参数加const修饰符。
从某些方面看,语言关键字显得过于严格。其实,一个纯函数也是可以调用一个非纯函数的,只要这个非纯函数的副作用不要波及到它的作用域之外就行。而整个程序也可以看作是纯函数化的,只要它只处理传入的命令行参数,而不会影响到到随机文件系统的状态。
我的热门文章
22
即使是一小步也想与你分享一位资深前端工程师总结的前端学习经验 - 博客频道 - CSDN.NET
聊点技术话题~
 中国的IT圈里有句话叫做“程序员吃的是青春饭”,许多IT公司也不愿意雇佣大龄程序员。因此,在有限的时间快速掌握高级技术变得非常重要。为了帮助新入行的小白快速走向技术人生的巅峰,这里分享一篇资深前端工作师总结的前端学习经验。
  这里主要讲的是自学,网站开发开发大致分为前端和后端,前端主要负责实现视觉和交互效果,以及与服务器通信,完成业务逻辑。其核心价值在于对用户体验的追求。
  前端的知识体系如上,可以按以下思路进行系统的学习:
  【基础知识】
  1. html + css 这部分可以在上学习(网址:),边学边练,每章后还有小测试。 之后可以模仿一些网站做些页面。在实践中积累了一些经验后,可以系统的读一两本书,推荐《head
first html 与 css 中文版》,这本书讲得非常细,估计很多人都没有耐心细读,你可以根据自己的实际情况斟酌。
  2. java 要学的内容实在太多,如果没有其他编程语言的基础的话,学起来可能要费些力,还是建议先在 w3cschool上学习。之后建议马上看《java语言精粹》,js是一门很混乱的语言,这本书能够帮助你区分哪些是语言的精华,哪些是糟粕,对于语言精华,应该深入学习。糟粕部分能看懂别人写的代码就行,自己就不用尝试了。
  刚开始的时候,你往往会比较迷茫,因为你写的东西似乎看起来毫无用处,比如实现一个简单的计算器,读取一个文件等。这个时候你就应该去学着写一些让你觉得有意思的东西了,所以你应该学习更多的知识。
  【进阶】
  有了以上基础,就可以进行一般的静态网页设计,不过对于复杂的页面还需要进一步学习。
  1. css。必看《精通css》,看完这本书你应该对:盒子模型,流动,block,inline,层叠,样式优先级,等概念非常了解了。作为练习可以看下《css艺门之匠》这本书,它对标题,背景,圆角,导航条,table,表单等主题都有详细的介绍。
  2. java。上面提到内容还不足以让你胜任js编程。在有了基础之后,进一步学习内容包括:
  a) 框架。推荐jQuery,简单易用,在w3cschool简单学习js后,直接上手jQuery即可完成一些简单的项目。学习方法也很简单,照着产品文档做几个页面就行了,不用面面俱到,以后遇到问题查文档就行了。框架可以帮你屏蔽浏览器的差异性,让你能更专注与web开发学习的精髓部分。
  补充: 可以使用 codecademy 学习 java,jQuery,用户体验真的很好(感谢 TonyOuyang )。
  b) java 语言范式 。这个名字可能并不恰当,主是我找不到可以描述“面向对象”,“函数式”这个两个概念的概念。java不完全是一个面向对象的语言,它的很多设计理念都有函数编程语言的影子,甚至说如果你不用面向对象,完全可以把它理解成一门函数式编程语言。java的很多语言特性,都是因为他具有函数式语言的特点才存在的。这部分推荐先学习面向对象的基本理论,对封装,继承,多态等概念要理解,维基百科,百度百科会是你的帮手,另外推荐《object oriented java》,应该有中文版。对与函数式编程我了解的也不系统,不好多说,可以自己百度一下。
  c) java 语言内部机制。必须弄清如下概念:js中变量的作用域,变量传递方式,函数的定义环境与执行环境,闭包,函数的四种调用方式(一般函数,对象的方法,apply,call),以及四种调用方式下,‘this'指向的是谁。这部分内容你会在《java语言精粹》中详细了解。另外,你必须理解json。
  d) dom编程,这个web前端工程师的核心技能之一。必读《dom编程艺术》,另外《高性能java》这本书中关于dom编程的部分讲的也很好。
  e) ajax编程,这是另一核心技术。ajax建议在网上查些资料,了解这个概念的来龙去脉,百度百科,维基百科上的内容就足够了。真正编程是很容易的,如今几乎所有框架都对ajax有良好的封装,编程并不复杂。
  f) 了解浏览器差异性。这部分包括css和js两部分,浏览器差异内容很多,建议在实践中多多积累。另外对于浏览器的渲染模式,DOCTYPE等内容应该系统学习。
  【代码层面】
  有了以上知识,对于大多数小型网站,你应该已经可以写出能够工作的代码了。但要想成为更专业的前端,你还需继续努力。更高的要求大概还有四方面:1易维护,2可测试,3高性能,4低流量(移动端)。
  1. 易维护。对于页面你该理解‘样式’,‘数据’,‘行为’三者分离,对应的当然就是css,html,js。对于js代码,你最好了解设计模式,重构,MVC等内容。
  2. 可测性。
  3. 高性能。必读《高性能java》
  4. 低流量。移动端关注比较多。
  【工程层面】
  前端项目同样面临软件生命周期的各个环节,首先是代码管理,你必须熟练使用svn和git。其次是代码的构建,如今前端代码构建已经不是简单的压缩一下了,需要进行依赖管理、模块合并、各种编译,必须要学会使用grunt等前端构建工具,最近gulp比较火,也需要了解。
  补充:
  对于前端开发,基本内容就这些了,可以根据自己的兴趣爱好选择性学习以下内容。
  1. 交互设计。大公司依然有专业人士搞这些,不过不懂交互的前端一定不是好前端。推荐《简约至上》。
  2. 后端。应该说前段工程师必须至少了解一门后端语言,不过如果爱好也可深入学习,入手难度比较低的应该是php了。这部分由可分为基于页面,基于框架两种。大型项目都是基于框架开发的,建议至少了解一个MVC框架,比如php的ci, yii, yaf 等,好还框架的设计思想都大同小异。如今NodeJs在大公司已经得到普遍的使用,推荐大家使用在Node上使用Express框架做一些后端服务的开发。
  3. flash。我并没有吧flash作为前端工程的核心技能之一,因为我不会,不过Action应该和js大同小异,可以根据工作需要学习。不过我的原则是能不用就尽量不用,其实很多效果通过js,css都可以实现,完全不需要flash。而且随着html5的发展flash早晚会淘汰。
  4. html5和css3 。HTML5规范已经于日发布了,移动端html5和css3已经得到了非常广泛的使用,相关的工具和环境也比过去好很多,有志前端必学。
  5. Android和ios开发。时至今日,前端的工作领域已经非常广泛,native的界面开发本质上也是前端开发,个大公司都面临着Native环境和web环境页面同时维护的问题,如果能够在技术上得到统一,将会有巨大的价值。对于学有余力的同学,应该了解Native开发的基本流程,至少了解到界面构建的技术。
w3cschoolcn
排名:千里之外developerWorks 社区
JavaScript 是一门优美的语言,具有动态性,弱类型,并有 C 和 LISP 的双重语法,重要的是,她本身是“可编程”的。文章先对 JavaScript 的函数式编程特性做一些介绍,然后讨论函数式编程在实际项目中的基本应用。
, 软件工程师, Jinfonet
邱俊涛,毕业于昆明理工大学计算机科学与技术专业,对机械控制、电子、人工智能等方面有浓厚的兴趣,对计算机科学的底层比较熟悉。喜欢 C/Java/Python 等语言。
基础知识函数式编程简介说到函数式编程,人们的第一印象往往是其学院派,晦涩难懂,大概只有那些蓬头散发,不修边幅,甚至有些神经质的大学教授们才会用的编程方式。这可能在历史上的某个阶段的确如此,但是近来函数式编程已经在实际应用中发挥着巨大作用了,而更有越来越多的语言不断的加入诸如 闭包,匿名函数等的支持,从某种程度上来讲,函数式编程正在逐步“同化”命令式编程。函数式编程思想的源头可以追溯到 20 世纪 30 年代,数学家阿隆左 . 丘奇在进行一项关于问题的可计算性的研究,也就是后来的 lambda 演算。lambda 演算的本质为 一切皆函数,函数可以作为另外一个函数的输出或者 / 和输入,一系列的函数使用最终会形成一个表达式链,这个表达式链可以最终求得一个值,而这个过程,即为计算的本质。然而,这种思想在当时的硬件基础上很难实现,历史最终选择了同丘奇的 lambda 理论平行的另一种数学理论:图灵机作为计算理论,而采取另一位科学家冯 . 诺依曼的计算机结构,并最终被实现为硬件。由于第一台计算机即为冯 . 诺依曼的程序存储结构,因此运行在此平台的程序也继承了这种基因,程序设计语言如 C/Pascal 等都在一定程度上依赖于此体系。到了 20 世纪 50 年代,一位 MIT 的教授 John McCarthy 在冯 . 诺依曼体系的机器上成功的实现了 lambda 理论,取名为 LISP(LISt Processor), 至此函数式编程语言便开始活跃于计算机科学领域。函数式编程语言特性在函数式编程语言中,函数是第一类的对象,也就是说,函数 不依赖于任何其他的对象而可以独立存在,而在面向对象的语言中,函数 ( 方法 ) 是依附于对象的,属于对象的一部分。这一点 j 决定了函数在函数式语言中的一些特别的性质,比如作为传出 / 传入参数,作为一个普通的变量等。区别于命令式编程语言,函数式编程语言具有一些专用的概念,我们分别进行讨论:匿名函数在函数式编程语言中,函数是可以没有名字的,匿名函数通常表示:“可以完成某件事的一块代码”。这种表达在很多场合是有用的,因为我们有时需要用函数完成某件事,但是这个函数可能只是临时性的,那就没有理由专门为其生成一个顶层的函数对象。比如:清单 1. map 函数
function map(array, func){
var res = [];
for ( var i = 0, len = array. i & i++){
res.push(func(array[i]));
var mapped = map([1, 3, 5, 7, 8],
function (n){
return n = n + 1;
print(mapped);
运行这段代码,将会打印:
2,4,6,8,9// 对数组 [1,3,5,7,8] 中每一个元素加 1注意 map 函数的调用,map 的第二个参数为一个函数,这个函数对 map 的第一个参数 ( 数组 ) 中的每一个都有作用,但是对于 map 之外的代码可能没有任何意义,因此,我们无需为其专门定义一个函数,匿名函数已经足够。柯里化柯里化是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。这句话有点绕口,我们可以通过例子来帮助理解:清单 2. 柯里化函数function adder(num){
function (x){
return num +
var add5 = adder(5);
var add6 = adder(6);
print(add5(1));
print(add6(1));结果为:67比较有意思的是:函数 adder 接受一个参数,并返回一个函数,这个返回的函数可以被预期的那样被调用。变量 add5 保持着 adder(5) 返回的函数,这个函数可以接受一个参数,并返回参数与 5 的和。柯里化在 DOM 的回调中非常有用,我们将在下面的小节中看到。高阶函数高阶函数即为对函数的进一步抽象,事实上,我们在匿名函数小节提到的 map 函数即为一种高阶函数,在很多的函数式编程语言中均有此函数。map(array, func) 的表达式已经表明,将 func 函数作用于 array 中的每一个元素,最终返回一个新的 array,应该注意的是,map 对 array 和 func 的实现是没有任何预先的假设的,因此称之为“高阶”函数:清单 3. 高阶函数function map(array, func){
var res = [];
for ( var i = 0, len = array. i & i++){
res.push(func(array[i]));
var mapped = map([1, 3, 5, 7, 8],
function (n){
return n = n + 1;
print(mapped);
var mapped2 = map(["one", "two", "three", "four"],
function (item){
return "("+item+")";
print(mapped2);将会打印如下结果: 2,4,6,8,9
(one),(two),(three),(four)// 为数组中的每个字符串加上括号mapped 和 mapped2 均调用了 map,但是得到了截然不同的结果,因为 map 的参数本身已经进行了一次抽象,map 函数做的是第二次抽象,高阶的“阶”可以理解为抽象的层次。JavaScript 中的函数式编程JavaScript 是一门被误解甚深的语言,由于早期的 Web 开发中,充满了大量的 copy-paste 代码,因此平时可以见到的 JavaScript 代码质量多半不高,而且 JavaScript 代码总是很飞动的不断闪烁的 gif 广告,限制网页内容的复制等联系在一起的,因此包括 Web 开发者在内的很多人根本不愿意去学习 JavaScript。这种情形在 Ajax 复兴时得到了彻底的扭转,Google Map,Gmail 等 Ajax 应用的出现使人们惊叹:原来 JavaScript 还可以做这样的事!很快,大量优秀的 JavaScript/Ajax 框架不断出现,比如 Dojo,Prototype,jQuery,ExtJS 等等。这些代码在给页面带来绚丽的效果的同时,也让开发者看到函数式语言代码的优雅。函数式编程风格在 JavaScript 中,函数本身为一种特殊对象,属于顶层对象,不依赖于任何其他的对象而存在,因此可以将函数作为传出 / 传入参数,可以存储在变量中,以及一切其他对象可以做的事情 ( 因为函数就是对象 )。JavaScript 被称为有着 C 语法的 LISP,LISP 代码的一个显著的特点是大量的括号以及前置的函数名,比如:清单 4. LISP 中的加法 (+ 1 3 4 5 6 7)加号在 LISP 中为一个函数,这条表达式的意思为将加号后边的所有数字加起来,并将值返回,JavaScript 可以定义同样的求和函数:清单 5. JavaScript 中的求和function sum(){
var res = 0;
for ( var i = 0, len = arguments. i & i++){
res += parseInt(arguments[i]);
print(sum(1,2,3));
print(sum(1,2,3,4,6,7,8));运行此段代码,得到如下结果: 6
31如果要完全模拟函数式编码的风格,我们可以定义一些诸如:清单 6. 一些简单的函数抽象
function add(a, b){
return a+b; }
function sub(a, b){
return a-b; }
function mul(a, b){
return a*b; }
function div(a, b){
return a/b; }
function rem(a, b){
return a%b; }
function inc(x){
return x + 1; }
function dec(x){
return x - 1; }
function equal(a, b){
return a==b; }
function great(a, b){
return a&b; }
function less(a, b){
return a&b; }这样的小函数以及谓词,那样我们写出的代码就更容易被有函数式编程经验的人所接受:清单 7. 函数式编程风格 // 修改之前的代码
function factorial(n){
if (n == 1){
return factorial(n - 1) *
// 更接近“函数式”编程风格的代码
function factorial(n){
if (equal(n, 1)){
return mul(n, factorial(dec(n)));
}闭包及其使用闭包是一个很有趣的主题,当在一个函数 outter 内部定义另一个函数 inner,而 inner 又引用了 outter 作用域内的变量,在 outter 之外使用 inner 函数,则形成了闭包。描述起来虽然比较复杂,在实际编程中却经常无意的使用了闭包特性。清单 8. 一个闭包的例子function outter(){
var n = 0;
function (){
return n++;
var o1 = outter();
o1();//n == 0
o1();//n == 1
o1();//n == 2
var o2 = outter();
o2();//n == 0
o2();//n == 1匿名函数 function(){return n++;} 中包含对 outter 的局部变量 n 的引用,因此当 outter 返回时,n 的值被保留 ( 不会被垃圾回收机制回收 ),持续调用 o1(),将会改变 n 的值。而 o2 的值并不会随着 o1() 被调用而改变,第一次调用 o2 会得到 n==0 的结果,用面向对象的术语来说,就是 o1 和 o2 为不同的 实例,互不干涉。总的来说,闭包很简单,不是吗?但是,闭包可以带来很多好处,比如我们在 Web 开发中经常用到的:清单 9. jQuery 中的闭包 var con = $("div#con");
setTimeout( function (){
con.css({background:"gray"});
}, 2000);上边的代码使用了 jQuery 的选择器,找到 id 为 con 的 div 元素,注册计时器,当两秒中之后,将该 div 的背景色设置为灰色。这个代码片段的神奇之处在于,在调用了 setTimeout 函数之后,con 依旧被保持在函数内部,当两秒钟之后,id 为 con 的 div 元素的背景色确实得到了改变。应该注意的是,setTimeout 在调用之后已经返回了,但是 con 没有被释放,这是因为 con 引用了全局作用域里的变量 con。使用闭包可以使我们的代码更加简洁,关于闭包的更详细论述可以在参考信息中找到。由于闭包的特殊性,在使用闭包时一定要小心,我们再来看一个容易令人困惑的例子:清单 10. 错误的使用闭包
var outter = [];
function clouseTest () {
var array = ["one", "two", "three", "four"];
for ( var i = 0; i & array.i++){
var x = {};
x.text = array[i];
x.invoke =
function (){
outter.push(x);
}上边的代码片段很简单,将多个这样的 JavaScript 对象存入 outter 数组:清单 11. 匿名对象 {
no : Number,
text : String,
function (){
// 打印自己的 no 字段
}我们来运行这段代码:清单 12. 错误的结果 clouseTest();// 调用这个函数,向 outter 数组中添加对象
for ( var i = 0, len = outter. i & i++){
outter[i].invoke();
出乎意料的是,这段代码将打印:
4而不是 1,2,3,4 这样的序列。让我们来看看发生了什么事,每一个内部变量 x 都填写了自己的 no,text,invoke 字段,但是 invoke 却总是打印最后一个 i。原来,我们为 invoke 注册的函数为:清单 13. 错误的原因function invoke(){
}每一个 invoke 均是如此,当调用 outter[i].invoke 时,i 的值才会被去到,由于 i 是闭包中的局部变量,for 循环最后退出时的值为 4,因此调用 outter 中的每个元素都会得到 4。因此,我们需要对这个函数进行一些改造:清单 14. 正确的使用闭包 var outter = [];
function clouseTest2(){
var array = ["one", "two", "three", "four"];
for ( var i = 0; i & array.i++){
var x = {};
x.text = array[i];
x.invoke =
function (no){
function (){
print(no);
outter.push(x);
}通过将函数 柯里化,我们这次为 outter 的每个元素注册的其实是这样的函数: //x == 0
x.invoke =
function (){print(0);}
x.invoke =
function (){print(1);}
x.invoke =
function (){print(2);}
x.invoke =
function (){print(3);}这样,就可以得到正确的结果了。实际应用中的例子好了,理论知识已经够多了,我们下面来看看现实世界中的 JavaScript 函数式编程。有很多人为使 JavaScript 具有面向对象风格而做出了很多努力 (JavaScript 本身具有 可编程性),事实上,面向对象并非必须,使用函数式编程或者两者混合使用可以使代码更加优美,简洁。jQuery 是一个非常优秀 JavaScript/Ajax 框架,小巧,灵活,具有插件机制,事实上,jQuery 的插件非常丰富,从表达验证,客户端图像处理,UI,动画等等。而 jQuery 最大的特点正如其宣称的那样,改变了人们编写 JavaScript 代码的风格。优雅的 jQuery有经验的前端开发工程师会发现,平时做的最多的工作有一定的模式:选择一些 DOM 元素,然后将一些规则作用在这些元素上,比如修改样式表,注册事件处理器等。因此 jQuery 实现了完美的 CSS 选择器,并提供跨浏览器的支持:清单 15. jQuery 选择器
var cons = $("div.note");// 找出所有具有 note 类的 div
var con = $("div#con");// 找出 id 为 con 的 div 元素
var links = $("a");// 找出页面上所有的链接元素当然,jQuery 的选择器规则非常丰富,这里要说的是:用 jQuery 选择器选择出来的 jQuery 对象本质上是一个 List,正如 LISP 语言那样,所有的函数都是基于 List 的。有了这个 List,我们可以做这样的动作:清单 16. jQuery 操作 jQuery 对象 (List) cons.each( function (index){
$( this ).click( function (){
//do something with the node
});想当与对 cons 这个 List中的所有元素使用 map( 还记得我们前面提到的 map 吗? ),操作结果仍然为一个 List。我们可以任意的扩大 / 缩小这个列表,比如:清单 17. 扩大 / 缩小 jQuery 集合 cons.find("span.title");// 在 div.note 中进行更细的筛选
cons.add("div.warn");// 将 div.note 和 div.warn 合并起来
cons.slice(0, 5);// 获取 cons 的一个子集现在我们来看一个小例子,假设有这样一个页面:清单 18. 页面的 HTML 结构 &div class="note"&
&span class="title"&Hello, world&/span&
&div class="note"&
&span class="title"&345&/span&
&div class="note"&
&span class="title"&Hello, world&/span&
&div class="note"&
&span class="title"&67&/span&
&div class="note"&
&span class="title"&483&/span&
&/div&效果如下:图 1. 过滤之前的效果我们通过 jQuery 对包装集进行一次过滤,jQuery 的过滤函数可以使得选择出来的列表对象只保留符合条件的,在这个例子中,我们保留这样的 div,当且仅当这个 div 中包含一个类名为 title 的 span,并且这个 span 的内容为数字:清单 19. 过滤集合 var cons = $("div.note").hide();// 选择 note 类的 div, 并隐藏
cons.filter( function (){
return $( this ).find("span.title").html().match(/^\d+$/);
}).show();效果如下图所示:图 2. 过滤之后的效果我们再来看看 jQuery 中对数组的操作 ( 本质上来讲,JavaScript 中的数组跟 List 是很类似的 ),比如我们在前面的例子中提到的 map 函数,过滤器等:清单 20. jQuery 对数组的函数式操作 var mapped = $.map([1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
function (n){
return n + 1;
var greped = $.grep([1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
function (n){
return n % 2 == 0;
});mapped 将被赋值为 : [2, 3, 4, 5, 6, 7, 8, 9, 10, 11]而 greped 则为: [2, 4, 6, 8, 10]我们再来看一个更接近实际的例子:清单 21. 一个页面刷新的例子function update(item){
function (text){
$("div#"+item).html(text);
function refresh(url, callback){
var params = {
type : "echo",
type:"post",
cache: false ,
async: true ,
dataType:"json",
data:params,
function (data, status){
callback(data);
function (err){
alert("error : "+err);
refresh("action.do/op=1", update("content1"));
refresh("action.do/op=2", update("content2"));
refresh("action.do/op=3", update("content3"));首先声明一个柯里化的函数 update,这个函数会将传入的参数作为选择器的 id,并更新这个 div 的内容 (innerHTML)。然后声明一个函数 refresh,refresh 接受两个参数,第一个参数为服务器端的 url,第二个参数为一个回调函数,当服务器端成功返回时,调用该函数。然后我们陆续调用三次 refresh,每次的 url 和 id 都不同,这样可以将 content1,content2,conetent3 的内容通过异步方式更新。这种模式在实际的编程中相当有效,因为关于如何与服务器通信,以及如果选取页面内容的部分被很好的抽象成函数,现在我们需要做的就是将 url 和 id 传递给 refresh,即可完成需要的动作。函数式编程在很大程度上降低了这个过程的复杂性,这正是我们选择使用该思想的最终原因。结束语实际的应用中,不会囿于函数式或者面向对象,通常是两者混合使用,事实上,很多主流的面向对象语言都在不断的完善自己,比如加入一些函数式编程语言的特征等,JavaScript 中,这两者得到了良好的结合,代码不但可以非常简单,优美,而且更易于调试。文中仅仅提到 jQuery 特征的一小部分,如果感兴趣,则可以在参考资料中找到更多的链接,jQuery 非常的流行,因此你可以找到很多论述如何使用它的文章。
参考资料 官方网站的地址,可以下载到最新的 jQuery 库。:一篇优秀的关于 JavaScript 闭包的论述。
文中提到的 的译文,该文详细的描述了 LISP 的其中基本原语,很好的解释了 LISP 的 可编程性。:一篇关于 JavaScript 函数式编程的基本概念的文章。“”:在本文中,您将了解如何通过 JavaScript 框架更轻松、更快速地创建具有高度交互性和响应性的 Web 站点和 Web 应用程序。“”:本专题为您收集了一些和目前业界比较流行的 JavaScript 开发工具包相关的资源,从初级的入门介绍到高级的使用以及和其他开发语言、软件集成的内容。developerWorks 和:随时关注 developerWorks 技术活动和网络广播。
:通过专门关于 Web 技术的文章和教程,扩展您在网站开发方面的技能。:这是有关 Ajax 编程模型信息的一站式中心,包括很多文档、教程、论坛、blog、wiki 和新闻。任何 Ajax 的新信息都能在这里找到。,这是有关 Web 2.0 相关信息的一站式中心,包括大量 Web 2.0 技术文章、教程、下载和相关技术资源。您还可以通过
栏目,迅速了解 Web 2.0 的相关概念。
developerWorks: 登录
标有星(*)号的字段是必填字段。
保持登录。
单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件。
在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。
所有提交的信息确保安全。
选择您的昵称
当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。昵称长度在 3 至 31 个字符之间。
您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。
标有星(*)号的字段是必填字段。
(昵称长度在 3 至 31 个字符之间)
单击提交则表示您同意developerWorks 的条款和条件。 .
所有提交的信息确保安全。
文章、教程、演示,帮助您构建、部署和管理云应用。
立即加入来自 IBM 的专业 IT 社交网络。
免费下载、试用软件产品,构建应用并提升技能。
static.content.url=/developerworks/js/artrating/SITE_ID=10Zone=Web developmentArticleID=497588ArticleTitle=JavaScript 中的函数式编程实践publish-date=}

我要回帖

更多关于 前端 函数式编程 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信