幾十年來,函數式編程一直是計算機科學狂熱者的至愛,由于數學的純潔性和謎一般的本質, 它被埋藏在計算機實驗室,只有數據學家和有希望獲得博士學位的人士使用。但是現在,它正經歷一場復興, 這要感謝一些現代語言比如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');
|
新聞熱點
疑難解答
圖片精選