几十年来,函数式编程一直是计算机科学狂热者的至爱,由于数学的纯洁性和谜一般的本质, 它被埋藏在计算机实验室,只有数据学家和有希望获得博士学位的人士使用。但是现在,它正经历一场复兴, 这要感谢一些现代语言比如Python,Julia,Ruby,Clojure以及——但不是最后一个——Javascript。
你是说Javascript?这个WEB脚本语言?没错!
Javascript已经被证明是一项长期以来都没有消失的重要的技术。这主要是由于它扩展的一些框架和库而使其具有重生的能力, 比如backbone.js,jQuery,Dojo,underscore.js等等。这与Javascript函数式编程语言的真实身份直接相关。 对Javascript函数式编程的理解很重要,并且在相当长的一段时间会对各种水平的程序员很有用。
为什么呢?函数式编程非常强大、健壮并且优雅。它对于大型数据结构非常有用并且高效。 Javascript作为一个客户端脚本语言,在应对日益复杂的网站时,函数式地操作DOM、 组织API响应以及完成一些其它任务会非常有好处。
在这本书里,你将会学习用Javascript进行函数式编程所需要知道的一切:如何用函数式编程构建你的Javascript web应用, 如何解锁Javascript隐藏的力量,如何编写更强大的代码,并且由于程序更小,使得代码更容易维护,能够更快被下载, 并且花费更少的开支。你还会学到函数式编程的核心概念,以及如何将它们应用到Javascript, 还有将Javascript作为函数式语言时如何回避一些问题,如何在Javascript中混合使用函数式编程和面向对象编程。
不过在我们开始前,先来做个实验。
例子
也许快速举个例子是介绍Javascript函数式编程最好的方式。我们将用Javascript完成一些任务—— 一个使用传统、原生的方法,另一个使用函数式编程。然后我们将会比较这两种方法。
应用——一个电子商务网站
为了追求真实感,我们来做一个电子商务网站,一个邮购咖啡豆的公司。这个网站会销售好几种类型的咖啡, 有不同的品质,当然也有不同的价格。
命令式方法
首先,我们开始写程序。为了让这个例子接地气,我们需要创建一些对象来保存数据。如果需要的话我们可以从数据库里取值。 但是现在我们假设他们是静态定义的:
- // create some objects to store the data.
- var columbian = {
-  name: 'columbian',
- basePrice: 5
- };
- var frenchRoast = {
- name: 'french roast',
- basePrice: 8
- };
- var decaf = {
- name: 'decaf',
- basePrice: 6
- };
- // 我们将使用辅助函数计算价格
- // 根据size打印到一个HTML的列表中
- function printPrice(coffee, size) {
- if (size == 'small') {
- var price = coffee.basePrice + 2;
- }
- else if (size == 'medium') {
- var price = coffee.basePrice + 4;
- }
- else {
- var price = coffee.basePrice + 6;
- }
- // create the new html list item
- var node = document.createElement("li");
- var label = coffee.name + ' ' + size;
- var textnode = document.createTextNode(label+' price: $'+price);
- node.appendChild(textnode);
- document.getElementById('products').appendChild(node);
- }
- // 现在我们只需根据咖啡的各种价格和size的组合调用printPrice函数
- printPrice(columbian, 'small');
- printPrice(columbian, 'medium');
- printPrice(columbian, 'large');
- printPrice(frenchRoast, 'small');
- printPrice(frenchRoast, 'medium');
- printPrice(frenchRoast, 'large');
- printPrice(decaf, 'small');
- printPrice(decaf, 'medium');
- printPrice(decaf, 'large');
新闻热点
疑难解答
图片精选