原文連接 By: Krzysztof Czernekjavascript
若是你是一名 JavaScript 開發人員,那麼你極可能會 已經看到過"函數式編程","函子","閉包"或"不變性"等概念了。你可能想知道這些東西究竟是什麼意思。也許你已經讀過一些相關資料。或者你可能正在嘗試將一些 FP (Functional Programming) 實踐應用到你的代碼中。html
若是是這樣,那麼我想咱們在同一條船上!java
大約兩年前,我開始在工做中使用JavaScript。從那時起,我一直在努力加深我對函數式編程的理解。react
一開始,每當聽到"柯里化(currying)"之類的東西,或者個人同事告訴我"請使用 map 而不是 forEach 並避免這些反作用"的時候,我感到很迷惑。git
從那時開始到如今,我已經學到了不少。試圖理解 FP 實踐是一種很是激動人心的體驗-- 到今天依然如此!github
如今,我想把我到目前爲止所學到的提煉成一系列文章--一些假如我如今從頭開始學習 FP 的話本身但願可以讀到的系列文章。我但願這能幫助到那些有跟我幾年前相似程度和背景的人。編程
函數式編程是一種編程範式--- 一種思考和構造代碼的方式。它是過程式編程或面向對象編程的替代方案。redux
FP 愛好者會說他們的目標是優化代碼的可重用性,可讀性和可測試性。他們工具箱中的經常使用工具是: 函數(functions),把函數 組合(compose) 起來構建更復雜的功能,以及 避免共享狀態(avoiding shared state) 和 反作用(side effects)。數組
若是這些話聽起來不知所云 -- 別擔憂,咱們很快就會搞清楚的!數據結構
互聯網上有大量的文章討論爲何函數式編程比面向對象編程更好。如何用它生成更易讀,更易於擴展,更易於測試和維護的代碼; 什麼是聲明式(declarative)編程,等等。
我贊成其中大部份內容。我不想再重複相同的論點,因此我但願你看一下上面的一些連接。
不過,我接下來要講的是另一些東西。我會告訴你爲何要考慮學習函數式編程。我會分享一下個人收穫,那也可能將是你的收穫。
若是你看一下不斷變化的 JS 生態,很明顯能夠看出來函數式編程實踐已經日益普及。大量很是酷的新框架和庫都受到了 FP 的重大影響, 例如:
你可能已經或者將要使用這些工具之一。若是你很好地理解了函數式編程的概念,那麼你能夠更快地掌握這些框架和庫。不然你可能要多花一些時間。
離開大學以後,你的大腦是否是再也沒有像在學校時那樣全速運轉過了?
我確定有過。個人意思是,個人工做充滿了挑戰。我花了不少時間思考:業務問題,系統架構,團隊狀態以及許多其餘東西。
這並非說跟上微積分課同樣。學那個的時候我須要絞盡腦汁來理解全部的概念,以及它們之間如何相互關聯。
嗯,學習函數式編程的感受其實有點兒相似。這也不奇怪,畢竟函數式編程就是來源於數學。
學習過程當中會有不少新的術語,理解這些知識可能會讓你頭暈眼花。可是在醍醐灌頂的時刻,你會體會到極大的知足。
我相信若是你在大學裏喜歡數學,那你確定也會喜歡學習這些東西的。
哦……這個說法可能不會讓你愛上函數式編程的,對吧?
我相信,即便你不打算在平常工做中切換到函數式編程,學習新的編程範式也是大有好處的。不只僅是由於這是一個挑戰 -- 更是由於它感受 很不同。
嘗試新的編碼風格可讓你接觸到另外一種大相徑庭的作事方法。也會迫使你從不一樣的角度思考問題。
你可能會認爲多花一些時間在已經熟練掌握的工具上面更划算。我知道那樣收效更快,更務實,可讓你的在那些你熟悉的技術上鑽得更深。
但我相信,做爲軟件開發者,咱們也須要拓寬咱們的視野。它有助於咱們更好地與其餘開發人員溝通,特別是當他們跟咱們背景不一樣的時候。從不一樣的角度來看問題,能夠幫助咱們作出更好的決策。
學習新的編程語言是拓寬專業知識的好方法。可是學習新的編程範式更好。
若是你已經決定要學習FP,那麼下一個問題就是:使用 JavaScript 是一個很好的方式嗎?
首先我得說 JavaScript 可能不是學習函數式編程概念的最佳途徑。緣由大概有如下這些。
其餘更加函數式的語言,內置了不可變數據結構. 而 JavaScript 沒有,所以你須要額外使用一個庫。這樣以來,你的代碼會比較冗長。
JavaScript 試圖模仿 Java,例如它的 class
,new
,以及其餘一些相似的東西。
JavaScript標準庫很糟糕。它固然不是考慮到爲 FP 概念而設計的。
關於 JS 是否是函數式編程的最佳選擇,還有不少爭論。
可是另外一方面,JavaScript 也有不少特性有助於實現函數式編程:
此外,我認爲最重要的一點是:JavaScript 很是流行,而且會愈來愈流行。
若是你打算使用 JavaScript,爲何不嘗試學習一種很是有用的新範式呢?
在本系列的下一部分中,我將介紹一些 FP 概念 - 從最基本的概念開始。我打算涵蓋如下幾個方面:
我會假定你已經瞭解了 JavaScript 的基礎知識,ES6 等等。對於理解FP概念來講,這並非一個強制要求。可是,它可讓你更輕鬆地完成示例並本身作一些嘗試。
準備好了嗎,下一章是:「函數式 JS#2:函數」。