javascript函数编程简介
几十年来,函数式编程一直是计算机科学爱好者们的最爱。由于纯度和神秘的数学,它是埋在计算机实验室里,它只是由数据科学家和那些希望获得博士学位的应用。但现在,它正处于复苏阶段,由于一些现代语言如Python,朱丽亚,露比,Clojure和--但不是最后一个一个Javascript。你是说Javascript这种网络脚本语言你对uff01
Javascript是没有消失的很长一段时间的重要技术。这主要是因为它扩展了一些与图书馆的框架有再生的能力,如backbone.js,jQuery,Dojo,Underscore.js,等等。这是对Javascript的函数式编程语言的真实身份直接有关。这是理解Javascript函数式编程的重要,它将为广泛的程序员很长一段时间是有用的。
为什么函数式编程非常强大、健壮和优雅。它对于大型数据结构非常有用和高效。在处理日益复杂的网站时,操作DOM、组织API响应和完成其他任务是非常有益的。
在这本书中,你将学习使用Javascript函数编程都需要知道如何构建Javascript的Web功能的编程应用,如何解锁Javascript的隐藏的力量,如何写更多的代码,因为程序较小,使得代码更容易维护,可以下载更快,成本支出少你也将学习函数式编程的核心概念,以及如何将它们应用到Javascript,以及如何避免一些问题时,Javascript作为一种功能性语言,以及如何组合功能的编程和面向对象编程的Javascript。
但在开始之前,让我们做一个实验。
例子
也许一个快速的例子是介绍Javascript函数编程的最好方法。我们将使用Javascript来完成一些任务,一个使用传统的本地方法,另一个使用函数式编程。然后我们将比较这两种方法。
应用——电子商务网站
为了追求真实感,我们想建立一个邮购咖啡豆的电子商务网站,这个网站将出售几种不同品质的咖啡,当然也有不同的价格。
命令的方法
首先,我们开始编写程序。为了使这个例子成为地面气体,我们需要创建一些对象来保存数据。如果需要的话,我们可以从数据库中获得值。但是现在我们假设它们是静态定义的:
创建一些对象来存储数据。
哥伦比亚= { { var
名称:'columbian,
基本价格:5
};
无功frenchroast = { {
名称:'french烤,
基本价格:8
};
无功无咖啡因= { {
名称:'decaf,
基本价格:6
};
我们将使用辅助函数/价格计算。
根据大小打印到HTML列表中。
功能printprice(咖啡、大小){
如果(大小= =小){
VaR coffee.baseprice +价格= 2;
}
如果(大小= = 'Medium'){
VaR coffee.baseprice +价格= 4;
}
{其他
VaR coffee.baseprice +价格= 6;
}
新的HTML列表项创建
var node = document.createelement(礼);
var标签= coffee.name + +大小;
var文本= document.createtextnode(标签+ 'price:$'+价格);
node.appendchild(文本);
document.getelementbyid(等级产品)AppendChild(节点);
}
现在我们只需要 / /咖啡价格和printprice函数调用大小组合
printprice(哥伦比亚,小);
printprice(哥伦比亚,'Medium');
printprice(哥伦比亚,大);
printprice(frenchroast,小);
printprice(frenchroast,'Medium');
printprice(frenchroast,大);
printprice(脱咖啡因咖啡,小);
printprice(脱咖啡因咖啡,'Medium');
printprice(咖啡因,大);
正如你所看到的,这个代码是非常基本的。如果现在有更多种类的咖啡,而不仅仅是三种改变呢如果有20个,甚至50个如果尺寸比较大怎么办如果有有机点和无机点怎么办这将很快使代码变得庞大!
这样,我们就可以让机器打印每种咖啡和每一种大小,这是采用这种命令方法的基本问题。
函数式编程
命令代码告诉计算机要做什么来逐步解决这个问题。相反,函数式编程试图用数学的方法来描述问题,而其余的则用计算机来描述。
以更有效的方式,同样的应用程序可以用这种方式编写:
数据和逻辑从接口的分解
无功printprice =功能(价格标签){
var node = document.createelement(礼);
var文本= document.createtextnode(标签+ 'price:$'+价格);
node.appendchild(文本);
document.getelementbyid(等级产品2)AppendChild(节点);
}
为每种咖啡创建函数对象
var哥伦比亚=函数(){()
this.name = 'columbian;
this.baseprice = 5;
};
无功frenchroast =函数(){()
this.name = 'french烤;
this.baseprice = 8;
};
无功无咖啡因=函数(){()
this.name = 'decaf;
this.baseprice = 6;
};
对于通过文本对象创建的每个大小
var小= {
GetPrice:函数(){ return this.baseprice + 2 },
getlabel:函数(){ return this.name +小}
};
var介质= {
GetPrice:函数(){ return this.baseprice + 4 },
getlabel:函数(){ return this.name +中}
};
var
GetPrice:函数(){ return this.baseprice + 6 },
getlabel:函数(){ return this.name +大}
};
类型和大小都在一组咖啡中
无功coffeetypes = {哥伦比亚,frenchroast,咖啡因};
无功coffeesizes = {小、中、大};
创建一个由上述内容组成的新对象,并将其放入一个新数组中。
VaR的咖啡= coffeetypes.reduce(功能(以前,电流){
无功newcoffee = coffeesizes.map(功能(mixin){)
是民心 / / ` plusmix `功能,参见第七章
无功newcoffeeobj = plusmixin(目前,混入);
返回新的newcoffeeobj();
});
返回previous.concat(newcoffee);
},{ });
现在我们已经定义了如何获得各种咖啡和大小组合的价格,现在可以直接打印出来了。
coffees.foreach(功能(咖啡){)
printprice(coffee.getprice(),coffee.getlabel());
});
首先要清楚的是,代码是模块化的。现在,一种新的大小或新类型的咖啡就像下面的代码一样简单:
函数(){()
this.name = 'peruvian;
this.baseprice = 11;
};
特大型= { { var
GetPrice:函数(){ return this.baseprice + 10 },
getlabel:函数(){ return this.name +特大}
};
CoffeeTypes.push(秘鲁);
CoffeeSizes.push(号);
咖啡对象数组和对象数组的大小(混合),即他们的方法和成员变量组合在一起,一个自定义的函数,称为plusminxin(见第七章)。这些咖啡类(哥伦比亚,frenchroast,咖啡因)包含成员变量,而这些对象的尺寸(小,中,大)包含名称和计算方法得到的价格。混合(混合)通过这一行动地图操作发挥作用,对于一个亚纯函数执行的每一个成员的数组并返回一个新的功能,提出通过减少功能操作返回的函数,降低是高阶函数,和地图一样,只是把所有的元素在数组中的组合处理后减少最后,新数组包含了所有可能的类型和大小组合。这个数组遍历foreach方法。foreach也是一个高阶函数,它允许在数组作为参数执行回调函数的每个对象,在这种情况下,回调函数是一个匿名函数。After it gets these objects, it calls the printPrice function with the return value of the two methods of getPrice () and getLabel ().
事实上,我们可以使这个示例更具功能性:将咖啡变量和字符串函数一起删除链接调用,这是函数编程的一个小技巧。
coffeetypes.reduce(功能(以前,电流){
无功newcoffee = coffeesizes.map(功能(mixin){)
功能 / / ` plusmixin `混合功能,见第七章
无功newcoffeeobj = plusmixin(目前,混入);
返回新的newcoffeeobj();
});
返回previous.concat(newcoffee);
},{ }(功能)。ForEach(咖啡){
printprice(coffee.getprice(),coffee.getlabel());
});
在这种方式中,控制流不遵循指令编码的顺序。在功能规划、地图功能和其他高阶函数代替for和while循环,只有一小部分关键代码是顺序执行的,这就为新人们读这样的范例代码难,但是一旦你能享受它,你就会发现它并不难,它看起来更好,这样。
这个例子刚刚开始展示函数编程在Javascript中能做什么。
总结
首先,使用函数式风格的优势很明显。其次,不要怕功能编程。事实上,它经常被认为是一种纯粹的逻辑程序设计语言的形式,但我们不需要明白lambda演算也可以用于日常任务。事实上,我们的节目由分裂成小片段,他们变得更容易理解、维护和更可靠。map和reduce函数是内置函数,都不知道在Javascript中,但是我们要注意到他们。
Javascript是一种交互式、易于使用、不需要编译的脚本语言,我们甚至不需要下载任何开发软件,您最喜爱的浏览器可以作为开发环境的解释器。
你感兴趣吗好吧,我们开始吧!