1、涵蓋大部分函數式編程思想
2、幽默風趣,通俗易懂
3、是Clojure風格的JavaScript
4、用JavaScript實現瞭很多奇技淫巧
5、所有開發者都可以在本書中找到一些啓發
在後端,函數式語言層齣不窮。在前端,函數式最後的邊界也已經被漸漸打破。Scala的Scala.js、Clojure的ClojureScript都試圖同構移嚮前端。然而,原生JavaScript其實也可以通過豐富的庫讓前端的函數式編程一樣的舒適和優雅。本書涵蓋瞭大部分函數式編程思想,包括JavaScript的函數式支持,Clojure風格的集閤、遞歸、函數組閤、宏、模式匹配、實用的Monads,以及前端的並發編程。本書適閤想要瞭解函數式編程的JavaScript程序員或者想學習JavaScript的函數式程序員閱讀。
歐陽繼超,ThoughtWorks高級谘詢師,活躍開源貢獻者(github.com/jcouyang),熱愛編程與寫作,譯有《函數式JavaScript》以及若乾開源書籍與文檔。
作為 Ramda.js 的作者之一,我非常喜歡 Braithwaite 的《JavaScript Allonge》,喜歡 Fogus 的《Functional JavaScript》,我非常激動又有一本關於JavaScript的函數式書籍,希望盡快能見到這本書的英文版。
—— CrossEye
第1章 函數式JavaScript 1
1.1 JavaScript也是函數式語言嗎 1
1.1.1 編程範式 1
1.1.2 JavaScript的函數式支持 3
1.2 作為函數式語言,JavaScript還差些什麼 10
1.2.1 不可變數據結構 11
1.2.2 惰性求值 11
1.2.3 函數組閤 12
1.2.4 尾遞歸優化 13
1.3 Underscore你錯瞭 14
1.3.1 跟大傢都不一樣的 map 函數 14
1.3.2 ClojureScript 16
1.3.3 Mori 17
1.4 小結 18
第2章 集閤 19
2.1 集閤的使用 20
2.1.1 嚮量(vector) 20
2.1.2 Map 23
2.1.3 函數組閤子 24
2.2 持久性數據結構 27
2.2.1 嚮量的持久性數據結構 28
2.2.2 最後一片葉子不完整 31
2.2.3 所有葉子完整且葉子個數不大於完全樹的葉子個數 32
2.2.4 所有葉子完整且葉子個數大於完全樹的葉子個數 34
2.3 不可變性 35
2.3.1 緻命魔術 36
2.3.2 引用透明性 38
2.3.3 函數式React 40
2.3.4 綫程不安全 42
2.4 惰性序列 44
2.4.1 改良奧利奧吃法 44
2.4.2 惰性求值與及早求值 46
2.4.3 惰性求值的實現 48
2.5 小結 50
第3章 遞歸 51
3.1 不可變性與遞歸 51
3.1.1 真的需要循環嗎 52
3.1.2 遞歸還是循環 54
3.2 柯裏悖論 55
3.2.1 Y組閤子 57
3.2.2 棧是多麼容易爆 60
3.3 尾遞歸優化 62
3.4 蹦跳樂園(Trampoline) 64
3.4.1 有窮狀態機(DFA) 65
3.4.2 Trampoline 67
3.5 小結 69
第4章 函數組閤 70
4.1 Underscore到底做錯瞭什麼 70
4.1.1 自由(Free)變量與約束(Bound)變量 72
4.1.2 閉包 74
4.2 柯裏化有什麼用 75
4.3 Transducer 78
4.3.1 Reducer 79
4.3.2 來看看更好更快的解法 79
4.3.3 Reducer 80
4.3.4 Reducible 81
4.3.5 Transducer詳解 82
4.3.6 跟柯裏化有什麼區彆 83
4.4 組閤與管道 84
4.4.1 管道(Pipeline) 84
4.4.2 組閤與管道 86
4.4.3 管道函數 87
4.5 小結 87
第5章 Macro宏 89
5.1 什麼是REPL 89
5.1.1 宏擴展器(Macro Expander) 90
5.1.2 那麼前端怎麼辦 92
5.2 為什麼要語法糖 93
5.2.1 隻是為瞭語法漂亮嗎 94
5.3 Sweet.js 94
5.3.1 Rule Macro 95
5.3.2 Case Macro 97
5.4 Infix Macro 和 Operator 104
5.4.1 Infix Macro 104
5.4.2 自定義操作符 105
5.5 小結 106
第6章 模式匹配 107
6.1 Destructure 107
6.1.1 對象 109
6.1.2 數組 109
6.1.3 函數 109
6.2 Arity 函數 110
6.3 Fizz Buzz 111
6.3.1 字麵匹配(Literal Matching) 111
6.3.2 綁定 113
6.3.3 Vector與Map匹配 113
6.3.4 Guard 114
6.3.5 Sparkler 114
6.4 代數數據類型(ADT) 116
6.5 小結 118
第7章 Monadic編程 119
7.1 鏈式調用 119
7.1.1 Promise 120
7.1.2 高階Promise 122
7.2 Monad 123
7.2.1 函子(Functor) 123
7.2.2 Applicative Functor 126
7.2.3 含幺半群(Monoid) 130
7.2.4 Monad就是容器界的管道 132
7.2.5 Monad就是自函子範疇上的一個幺半群 136
7.3 走鋼絲 139
7.3.1 用Monad錶示薛定諤貓 139
7.3.2 皮爾斯走鋼絲 140
7.4 Monad在JavaScript中的應用 143
7.4.1 Promise版本的走鋼絲 144
7.4.2 When 144
7.5 Reactive編程 146
7.5.1 流(Stream) 146
7.5.2 Functor 147
7.5.3 Applicative 147
7.5.4 Monad 148
7.5.5 一個“簡單”的Reactive實例 149
7.6 小結 153
第8章 並發編程 154
8.1 什麼是並發 154
8.1.1 異步與多綫程 155
8.1.2 JavaScript的並發模型 157
8.2 通信順序進程(CSP) 160
8.3 使用Generator實現CSP 162
8.3.1 Generator 163
8.3.2 Go Block 163
8.3.3 timeout 164
8.3.4 take <! 165
8.3.5 put >! 165
8.3.6 JavaScript CSP版本的例子 166
8.4 實戰 CSP 168
8.4.1 使用移植的core.async 168
8.4.2 使用ES7中的異步函數 169
8.4.3 try catch 170
8.5 小結 173
參考資料 174
4.2 柯裏化有什麼用
還記得上一章提到的提齣柯裏悖論的 Haskell Curry 嗎?這裏要說到的柯裏化中的 柯裏,完全不是巧閤,確實就是 Haskell Curry 的姓。藉助於利用他的名字命名的語言 Haskell,可以更好地理解柯裏化。
在 Haskell 語言中,函數是會自動柯裏化的:
max 3 4
其實就是:
(max 3) 4
可以看看 max 與 max 3 函數的類型:
ghci> :t max
max :: Ord a => a -> a -> a
看明白瞭嗎?Ord a => 錶示類型約束 a 為可以比較大小的類型,因此 max 的類型可以翻譯成:當給定一個 a,會得到 a -> a,即接收一個 a 類型,返迴一個 a 類型。接下來再看看 max 3 的類型就好理解瞭。
ghci> :t max 3
(Num a, Ord a) => a -> a
左側錶示類型約束 a 可以是 Ord 或者 Num,意思是 max 3 還是一個函數,如果給定一個 Ord 或者 Num 類型的參數,則返迴一個 Ord 或者 Num 類型。
現在是不是清晰瞭?在Haskell中,每給定一個參數,函數如果是多參數的,該函數還會返迴一個處理餘下參數的函數。這就是自動柯裏化。
而在 JavaScript(以及大多數語言) 中則不是這樣的,如果給定多參函數的部分參數,函數會默認其他參數是 undefined ,而不會返迴處理剩餘參數的函數。
反正最後都要計算齣值,那麼柯裏化和一次把所有約束添加上有什麼區彆呢?
再迴到上一節的例子,還記得我們要編寫一本能拿到所有男性姓名的操作手冊吧。我們把_.filter 硬是改寫成瞭柯裏化版本的Rfilter,終於可以組閤我們的操作手冊瞭:
const getMaleName = _.compose(
data => _.map(data, d => d.name), // <1>
Rfilter(d => d.sex == 'male')) // <2>
getMaleName(data)
(1)對於還沒有柯裏化的_.map就隻能說:提取數據的名字,這裏的數據等於傳入的數據。
(2)我可以明確地在手冊裏寫:過濾齣數據中性彆為男性的。
對比這兩行明顯可以看齣,第一行特彆囉唆,就是因為把本來應該是自由變量的data當約束變量給瞭_.map函數。相反,Rfilter並不需要data這個自由變量,意義卻完全一樣,這種方式又叫作“Pointfree”或者“Pointless”。
而且,當柯裏化_.filter函數之後,我們實際上得到的是兩個函數,而不隻是一個。給定一個約束後得到一個新的函數,這個函數就可以拿來組閤其他函數,或者再給定不同約束返迴不同給定值。
當可組閤的函數越多,就能夠越大程度地復用現有函數,組閤齣更多的函數。就像樂高積木,如果買一般的通用樂高,其實可以組閤齣各式各樣的形狀,但是一旦有些積木給瞭一些設定,比如你買瞭一盒辛普森一傢的樂高(圖4-1),就很難和生活大爆炸的樂高(圖4-2)組閤到一塊去,因為其中很多積木都添加瞭一些設定,設定越多,則離抽象越遠,離具體越近,也就越難復用。
1.看本書之前你要知道
1)最好能看懂JavaScript代碼
這既不是一本介紹Clojure的書,也不是一本介紹JavaScript的書,而是一本介紹如何用JavaScript函數式編程的書。其中一些函數式的思想和錶現形式都藉用瞭Clojure,因此叫作Clojure 風格的函數式JavaScript,但是並不要求在讀本書前會Clojure ,而隻需要能閱讀JavaScript代碼。如果你會Clojure,則可以完全忽略我解釋Clojure代碼的段落,當然JavaScript的部分纔是重點。
2)你可能買錯書瞭,如果你
想學JavaScript
這不是一本JavaScript的教科書,這裏隻會介紹如何用JavaScript進行函數式編程,所以如果想要係統地學習JavaScript,則學習《JavaScript語言精粹》可能已經足夠瞭。另外,如果讀者的英文水平好的話,則還有一本可以在綫免費閱讀的JavaScript Allonge。
想學Clojure
同樣,這也不是一本Clojure的教科書,隻含有一些用於闡述函數式編程思想的Clojure代碼。你確實可以學到一些Clojure編程知識,但很可能是非常零碎且不完整的知識。如果想要係統地瞭解和學習Clojure,則非常推薦你閱讀The Joy of Clojure ,另外,如果讀者英文比較好,還有一本可以免費在綫閱讀的CLOJURE for the BRAVE and TRUE也非常不錯。
是函數式編程的專傢
如果你已經在日常工作或學習中使用Scala、Clojure或者Haskell等函數式語言編程的話,那麼本書對你在函數式編程上的幫助不會太大。不過:這本書對緩解你從函數式語言遷移到JavaScript編程的不適應該是非常有效的。這也正是本書的目的之一。
2.準備環境
在開始閱讀本書之前,如果你希望能運行書中的代碼,可能需要一些環境的配置。而且書中的所有源碼和運行方式都可以在本書的Github倉庫 中找到。當然如果你使用Emacs(同時還配置瞭org babel的話)閱讀本書的源碼,對於大部分代碼隻需要光標放在代碼處按c-c c-c即可。
JavaScript
原生的JavaScript沒有什麼好準備的,可以通過Node或者Firefox(推薦)的Console運行代碼。當然第5章會有一些使用Sweet.js寫的Macro,這則需要安裝Sweet.js。
– 安裝Node/io.js
(1)下載Node.js。
(2)如果使用Mac,可以直接用Brew安裝。
brew install node
# 或者
brew install iojs
– 安裝Sweet.js
在安裝完Node.js之後在命令行輸入:
npm install -g sweet.js
Clojure
書中的Clojure代碼大都用來描述函數式編程的概念,當然如果想要運行書中的 Clojure 代碼,首先需要安裝JVM或者JDK ,至少需要1.6版本,推薦安裝1.8版本。
– 安裝 leiningen
leiningen是Clojure的包管理工具,類似於Node的Npm、Ruby的bundle、Python的pip。另外leiningen還提供腳手架的功能。可以通過官網的腳本安裝 。Mac用戶可以簡單地使用brew install leiningen安裝。
安裝完成之後,就可以運行lein repl,打開repl,試試輸入下列Clojure代碼,你將會立馬看見結果。
(+ 1 1)
;=> 2
– 編輯器
如果更喜歡使用編輯器來編輯更長的一段代碼,我推薦非Emacs用戶使用Light Table ,Intellij用戶則使用cursive 。當然如果讀者已經在使用Emacs,那就更完美瞭,Emacs cider mode 是Clojure編程不錯的選擇。
3.本書中的代碼
書中的所有源碼和運行方式都可以在本書的Github倉庫 中找到,書中幾乎所有的例子都以測試的形式完成。
4.反饋
如果你是開源貢獻者,那麼應該很習慣通過Github Issue9提交任何反饋,如果是Pull Request,那就更好瞭。當然如果沒有使用過Github Issue也沒有關係,這裏 有非常詳細的教程。
5.代碼風格約定
本書的JavaScript代碼都遵循Airbnb JavaScript Style Guide 中的ES5和React的風格約定。
6.本書的組織結構
第1章
將介紹JavaScript的基本函數式背景,簡要地介紹為什麼要關心函數式編程,為什麼說Underscore不夠函數式,JavaScript要作為完整的函數式語言還缺些什麼?
第2章
主要介紹Clojure的集閤數據結構。這是個無聊但是又很重要的章節,可以說函數式編程最基本、最重要的就是集閤操作。本章會涉及如何操作集閤、惰性求值與惰性序列。
第3章
在瞭解瞭持久性數據結構後,我們可能會産生疑惑,如果數據結構都是不可變的,那麼循環該怎麼寫呢?本章就是要解開各種使用不可變數據結構的疑惑,用這些不可變數據結構可以切換一種編程的思維方式。
第4章
Underscore並不利於函數組閤,但是函數組閤其實是函數式編程最重要的思想。在這一章裏麵,我會詳細介紹為什麼說Underscore錯瞭,而為什麼要喜歡上柯裏化,以及Clojure 1.7新推齣的Transducer又是如何幫助我們更容易組閤齣更高效的函數的。
第5章
我特彆不情願把Macro翻譯成宏。宏特彆容易讓人以為是 C 語言裏麵那個#define宏,雖然都是宏,但其實那裏跟這裏說的Macro不是一個級彆的。Macro是Lisp語言之所以特彆的原因之一。本章我們就來看看到底什麼是、為什麼,以及如何在JavaScript中使用Macro。
第6章
這裏說的模式匹配包括兩種:一種是按位置或者key匹配集閤,取齣相應數據。另一種是Haskell風格的對函數參數的模式匹配。本章篇幅比較小,因為模式匹配並不是Clojure(也不是JavaScript)的主要模式,盡管在一些有強大類型係統的函數式語言(Scala、Haskell)中比較重要。
第7章
Monad這個範疇論裏齣來的神秘玩意,但你可能沒有在意,其實這在前端世界早都被玩膩瞭。本章將會介紹Monad和它的朋友們,並且將帶你體驗JavaScript的Promise,以及Reactive編程。
第8章
並發編程一直是令人頭疼的編程方式,直到Clojure和Go的齣現,徹底改變瞭我們並發編程的方式。而對於單綫程的JavaScript,基於事件循環的並發模型也一直睏擾著我們,到底能從Clojure學些什麼,可以使我們的前端並發編程之路更順暢一些呢?本章將帶你熟悉並發、JavaScript的並發模型,以及CSP並發模型。
7.本書使用的約定
本書使用以下字體排版約定。
1)楷體
錶示新的術語。
2)等寬字體
代碼清單,齣現在段落之內則錶示變量、函數名、關鍵字等。
3)粗體
重點概念。
4)下畫綫
需要填入的詞,我可能已經幫大傢填上瞭。
5)橫綫
可以忽略的詞。
對於我這種在函數式編程領域還處於探索階段的開發者來說,這本書的齣現簡直是福音。我一直對函數式編程帶來的那種“聲明式”的美感心嚮往之,但每次嘗試著去理解那些復雜的概念時,總會感到力不從心。我寄希望於這本書能夠用一種更加清晰、更有條理的方式,將函數式編程的思想滲透到前端開發的各個方麵。我期待它能夠不僅僅是羅列函數式編程的特性,而是能夠深入分析這些特性為何對前端開發如此重要,以及它們如何幫助我們寫齣更具可讀性、可維護性和可擴展性的代碼。也許書中會包含一些關於函數式編程在處理副作用、提升代碼純度、以及簡化組件邏輯方麵的具體技巧和模式。我對那些能夠幫助我提升代碼的“健壯性”和“可預測性”的技巧尤為感興趣,因為這直接關係到項目的穩定性和開發效率。
評分作為一名前端開發者,我一直在尋找能夠提升代碼質量和開發效率的方法。函數式編程的理念一直讓我很感興趣,但市麵上相關的書籍大多晦澀難懂,或者過於偏重理論,難以在實際工作中找到切入點。這本書的名字——《前端函數式攻城指南》,非常直觀地傳達瞭它的核心價值。我預感它會是一本能夠“實戰”的教程,而不是一本“紙上談兵”的理論手冊。我希望它能通過大量的代碼示例、清晰的圖示以及逐步深入的講解,幫助我理解函數式編程的各種核心概念,比如純函數、不可變性、高階函數、函數組閤等等,並且能夠教會我如何在React、Vue或其他主流前端框架中有效地運用這些概念。我尤其期待它能分享一些在實際開發中遇到的典型問題,以及如何用函數式的方式來優雅地解決它們,從而讓我的代碼更加健壯、易於理解,並且能夠大大減少bug的産生。
評分我是一名有幾年工作經驗的前端工程師,一直以來,都在尋找能夠讓我跳齣舒適區,學習新技術的契機。函數式編程這個概念,我聽過很多次,也嘗試過閱讀一些相關的技術文章,但總覺得有些零散,缺乏一個係統性的學習路徑。這本書的名字《前端函數式攻城指南》,非常準確地捕捉到瞭我目前的學習需求——我需要一個能夠指導我“攻剋”函數式編程這個技術難關的“指南”。我希望這本書的內容能夠從最基礎的概念講起,但又不會停留於錶麵,而是能夠深入到實際的應用層麵。例如,它是否會詳細講解如何在JavaScript中實現高階函數,如何利用函數組閤來構建復雜的邏輯,以及如何通過不可變數據結構來避免副作用?我更期待的是,書中能夠提供一些具體的代碼片段,甚至是小型的項目示例,來展示函數式編程在解決實際前端開發問題時的強大威力,比如狀態管理、異步操作、事件處理等等。
評分這本書的標題《前端函數式攻城指南》讓我眼前一亮,它精準地戳中瞭當前前端技術發展的一個重要方嚮。我一直認為,掌握函數式編程是成為一名優秀前端工程師的必經之路,但很多時候,對於如何將抽象的函數式概念轉化為實際可操作的前端代碼,感到有些迷茫。我希望這本書能夠為我提供一個清晰的學習框架,從函數式編程的基礎概念齣發,逐步引導我理解它在前端開發中的實際應用。我期待書中能夠包含一些關於如何利用函數式思維來重構現有代碼、如何編寫更簡潔高效的UI組件、以及如何更有效地管理應用狀態的實戰案例。這本書如果能深入講解如何將這些函數式編程的優點,如純粹性、不可變性、聲明式風格等,融入到日常的前端開發流程中,那將是我最大的收獲。
評分這本書的封皮設計真是令人耳目一新,簡潔卻又不失專業感。我剛拿到手的時候,就被那淡淡的磨砂質感吸引瞭。拿到這本書,我心裏就想著,終於有一本能讓我係統地瞭解函數式編程在前端開發中的應用瞭。最近幾年,函數式編程的概念在技術圈子裏越來越火,很多大廠的招聘要求裏也常常齣現,但總是感覺有些玄乎,難以真正落地。這本書的齣現,就像是為我打開瞭一扇新的大門。我期待它能用一種更加平易近人、循序漸進的方式,把我從命令式編程的思維模式中引導齣來,讓我領略到函數式編程帶來的代碼優雅、可維護性和可測試性。特彆是它提到的“攻城”二字,讓我感覺這本書不僅僅是理論的講解,更像是一場實戰演練,會包含很多實際的案例和解決方案,能幫助我真正掌握如何在實際項目中應用這些概念,解決那些棘手的技術難題。
評分14
評分作者比較扯吧,感覺對不起價格,什麼人都能齣書瞭
評分很不錯的一本書
評分前端函數式攻城指南
評分14
評分囤書,,,,,,
評分不錯 挺好的
評分全新正版,送貨及時,活動給力,蠻好。
評分和同學一起買的,很不錯的書? ?(?¯???¯???)?”
本站所有內容均為互聯網搜尋引擎提供的公開搜索信息,本站不存儲任何數據與內容,任何內容與數據均與本站無關,如有需要請聯繫相關搜索引擎包括但不限於百度,google,bing,sogou 等
© 2025 book.coffeedeals.club All Rights Reserved. 靜流書站 版權所有