譯者團隊(排名不分前後):阿希、blueken、brucecham、cfanlife、dail、kyoko-df、l3ve、lilins、LittlePineapple、MatildaJin、冬青、pobusama、Cherry、蘿蔔、vavd317、vivaxy、萌萌、zhouyaojavascript
關於譯者:這是一個流淌着滬江血液的純粹工程:認真,是 HTML 最堅實的樑柱;分享,是 CSS 裏最閃耀的一瞥;總結,是 JavaScript 中最嚴謹的邏輯。通過捶打磨練,成就了本書的中文版。本書包含了函數式編程之精髓,但願能夠幫助你們在學習函數式編程的道路上走的更順暢。比心。前端
本書主要探索函數式編程[1](FP)的核心思想。在此過程當中,做者不會執着於使用大量複雜的概念來進行詮釋,這也是本書的特別之處。咱們在 JavaScript 中應用的僅僅是一套基本的函數式編程概念的子集。我稱之爲「輕量級函數式編程(FLP)」。java
註釋: 題目中使用了「輕量」二字,然而這並非一本「輕鬆的」「入門級」書籍。本書是嚴謹的,充斥着各類複雜的細節,適合擁有紮實 JS 知識基礎的閱讀者進行研讀。「輕量」意味着範圍縮小。一般來講,關於函數式編程的 JavaScript 書籍都熱衷於拓展閱讀者的知識面,並企圖覆蓋更多的知識點。而本書則對於每個話題都進行了深刻的探究,儘管這種探究是小範圍進行的。git
讓咱們面對這個事實:除非你已是函數式編程高手中的一員(至少我不是!),不然相似「一個單子僅僅是自函子中的幺半羣」這類說法對咱們來講毫無心義。程序員
這並非說,各類複雜繁瑣的概念是無心義的,更不是說,函數式編程者濫用了它們。一旦你徹底掌握了輕量的函數式編程內容,你將會/希望會想要對函數式編程的各類概念進行更正式更系統的學習,而且你必定會對它們的意義和緣由有更深刻的理解。github
可是我更想要讓你可以如今就把一些函數式編程的基礎運用到 JavaScript 編程過程當中去,由於我相信這會幫助你寫出更優秀的,更符合邏輯的代碼。編程
更多關於本書背後的動機和各類觀點討論,請參看[前言]。閉包
本書主要在 on Leanpub 平臺上以電子版本的形式進行出版。我也嘗試出售本書的紙質版本,但沒有肯定的方案。app
除了購買本書之外,若是你想要對本書做一些物質上的捐贈,請在 patreon 上進行操做。本書做者感謝你的慷慨解囊。frontend
本書內容大多源自於我教授的一個同名課程(以公司舉辦的公開或內部研討會這樣的形式進行)。
若是你喜歡本書的內容,並但願組織此類課程,或者組織關於其餘 JS/HTML5/Node.js 課程,請經過如下方式聯繫我:
getify.me
我還提供一些能夠在線點播的 JS 培訓課程。我在 Frontend Masters 上開辦課程,例如個人 Functional-Lite JS 研討會。還有一些課程發佈在 PluralSight 上。
很是歡迎對於本書的任何內容貢獻。可是在提交 PR 以前請務必認真閱讀 Contributions Guidelines。
本書全部的材料和內容都歸屬 (c) 2016-2017 Kyle Simpson 全部。
本書根據Creative Commons Attribution-NonCommercial-NoDerivs 4.0 Unported License 進行受權許可.
衆所周知,我是一個函數式編程迷。我嘗試閱讀最新的學術論文,業餘時間乃至工做間隙研究抽象代數(譯者注:抽象代數又稱近世代數,是研究各類抽象公理化代數系統的數學學科,也是現代計算機理論基礎之一),並四處傳播函數式編程的理念和語言。我所書寫的 JavaScript 代碼,每一條語句都是純的。沒錯,我就是一個徹頭徹尾的函數式編程教條式的狂熱者。關於爲何要寫純的語句,請看我寫的這本書。
其實我之前並非這樣子... 我曾癡迷於面向對象,並熱衷於使用面向對象的方法來構建「真實世界」。我是人造機器人的發明者,夜以繼日地修正機器人以達到更高精度的控制力。我也是有意識木偶的創造者,手指在鍵盤上的輕舞飛揚賦予了它們生命。作爲黑客界的蓋比特(譯者注:蓋比特是玩具之父),在連續不間斷的寫了 5 年面向對象的代碼後,我對於這些成果仍是不甚滿意。整個過程也並不順利,我一直感受本身是一個糟糕的程序員,甚至失去了信心,認爲寫出既簡單,又靈活同時又很好擴展的代碼是不可能的。
我想是時候去嘗試一些新的方法了,我開始涉足函數式編程的理念,並把它用在個人代碼中。個人同事對此很是驚詫,他們根本不知道我在幹什麼。那段時間裏我寫的代碼很是糟糕、另人生厭、簡直是垃圾。形成這樣結果的緣由是我缺乏一個目標或者說願景。固然如今那個會編碼的蟋蟀傑明尼(譯者注:原文使用 Jiminy-Coding-Cricket 迪士尼動畫人物蟋蟀傑明尼來暗指以前蹩腳的本身)已經不在了。在花費了好長時間,寫了好多垃圾程序後我才弄明白怎樣正確進行函數式編程。
如今,經歷了那些亂七八糟的探索後,我感受到純函數編程實現了它所承諾的代碼可讀性和可複用。我再也不發明而是發現個人模型,我像一個正在揭開巨大陰謀的偵探,在軟木板上釘滿了數學證據。一個數字時代的庫斯托(譯者注:庫斯托是個傳奇式的人物,探險家、電影製片人,一個享有戴高樂將軍同樣世界性聲譽的法國人,做者比喻本身學習函數式編程就像庫斯托探索海洋通常)以科學的名義記錄下了這片奇特土地的特徵!雖然並不完美,仍有不少東西要學習,但我對個人工做和產出從未有過如今這般滿意!
假如一開始就有這本書,我探索純函數式編程世界的道路就會更平坦一點,而不是荊棘滿地。本書有兩層:第一層教會你如何在天天的編碼工做中,有效地使用各類各樣的函數式構造方法。另外一層則更重要,本書會提供一個準星,確保你不會偏離函數式編程的原則。
函數式編程是一種編程範式,Kyle 倡導使用它來實現聲明式編程和函數式編程,同時該範式還能夠與 JavaScript 世界造成平衡和互動。經過學習本書,你無需完全理解範式的一切,就能瞭解純函數式編程的基礎;你無需從新創造輪子,就能得到練習和探索函數式編程的技能,並讓代碼運行良好;你無需像我以前同樣漫無目的地徘徊、甚至走回頭路就能讓你的職業生涯更上一層樓。你的合做者和同事們必定會欣喜若狂!
Kyle (譯者注:Kyle 是火爆全球的《你不知道的 JavaScript》一書原做者)是一位偉大的老師,他對函數式編程的宏偉藍圖不懈追求,不放過任何一個角落和縫隙,同時他也苦學習者之苦。他的風格與行業產生共鳴,將你們的水平總體提升了一個檔次。他的工做成果不只出如今不少人的收藏夾中,也在 JavaScript 發展歷史上佔據堅實地位。Kyle 老師是絕世高手,你值得擁有。
函數式編程有不少種定義。Lisp 程序員和 Haskell 程序員對於函數式編程的定義大相徑庭。OCaml 和 Erlang 語言對於函數式編程範式的見解也截然不同。即便在同一種語言 JavaScript 中,你也能看到函數式編程不一樣的定義。但總有一種紐帶把這些不一樣的函數式編程鏈接在一塊兒,這個紐帶是一個有些模糊的「我一看就知道」的定義,這聽起來有點下流(有人確實以爲函數式編程下流)。本書旨在抓住這個紐帶,並不讓你學習某些圈子的固定習語,而是讓你獲取相關知識,這些知識不論在哪一個語言的函數式編程中都適用。
本書是你開啓函數式編程旅途的絕佳起點。開始吧,Kyle 老師...
-Brian Lonsdorf (@drboolean)
單子是自函子範疇上的一個幺半羣
有暈頭轉向嗎?不要擔憂,我本身也被繞暈了!對於那些已經瞭解函數式編程的人來講,這些專業術語纔有意義,然而對於大部分人而言,它們沒有任何意義。
這本書並不打算教你以上那些專業術語的具體含義。若是那正是你想查找的,請繼續查閱。事實上,已經有不少從頭至尾(正確的方式)介紹函數式編程的書了。若是你在深刻學習函數式編程,這些專業術語有很重要的意義,你確定會對這些專業術語愈來愈熟悉。
可是本書打算以另外一種方式講解函數式編程。我將從函數式編程的一些基礎概念講起,並儘量少用晦澀難懂的專業術語。咱們將嘗試以更實用的方法來探討函數式編程,而非純粹的學術角度。毫無疑問,確定會有專業術語。可是我將會當心謹慎的引入這些術語並解釋爲什麼它們如此重要。
可悲的是我並不是酷酷的函數式編程俱樂部的一員。我從沒有正式學過函數式編程。儘管我有計算機方面的教育背景並對數學有必定了解,但數學符號跟我理解的編程徹底是兩回事。我歷來沒寫過一行 Scheme、Clojure 或 Haskell 代碼,也不是老派的 Lisp 程序員。
我曾參加過不可勝數的討論函數式編程的會議,每次都但願能完全搞明白函數式編程中那些神祕的概念究竟是什麼意思。然而每次我都失望而歸,那些概念在我腦海裏亂成一團,我甚至不清楚本身學了些什麼。也許我學到了些東西吧,可是很長時間以來我都不能肯定本身學到了什麼。
經過不斷的編程實踐,而非站在學術的角度,我慢慢的理解了那些對函數式編程者[1]
來講很簡單直白的重要概念。你是否也有相似的經歷 —— 你早就知道一件事,但直到好久以後你忽然發現它居然還有一個你歷來不知道的名字!?
也許你像我同樣;好幾年前就據說過像「map-reduce」,「big data」等這些術語,但並不懂它們的實際意義。最終我明白了map(..)函數到底作了哪些事情 —— 在我知道列表操做是通向函數式編程者之路的基石,而且爲什麼它們如此重要以後。我知道映射好久了,甚至在我知道它叫map(..)
以前。
最終我開始整理這些想法並將它們稱之爲「輕量級函數式編程」(FLP)。
可是,爲何學習函數式編程如此重要,即使只是學習輕量級函數式編程?
最近幾年我愈來愈深入的理解到編程的核心是人,而不是代碼,我甚至將其視爲一種信仰。我堅信代碼只是人類交流的手段,只是它產生的反作用(彷彿聽到了自我引用的笑聲)纔對電腦發出具體指令。
在我看來,函數式編程的核心在於讓你在編程時使用一些廣爲人知、易於理解的模式。通過驗證,這些模式能夠有效隔離讓代碼難以理解的錯誤。因此,函數式編程 —— 咳,輕量級函數式編程 —— 是每一個開發者均可以掌握的重要工具之一。
monad的含義是,一旦你搞懂了,你就沒法跟別人解釋什麼是monad了。
Douglas Crockford 2012 "Monads and Gonads"
我但願這本書有可能打破上面的詛咒,儘管咱們要到最後的附錄部分纔開始討論「monad」。
科班出身的函數式編程者常常宣稱只有 100% 使用函數式編程纔算是真正地使用函數式編程:這是一種要麼全有要麼全無的主張。它會讓人以爲若是編程時只有一部分使用了函數式編程而另外一部分沒用到,整個程序會被那些沒有使用函數式編程的部分污染,從而認爲使用函數式編程並不值得。
我想明確地說:我認爲絕對主義並不存在。這沒有意義,就像愚蠢地建議我只有使用完美的語法,這本書纔算完美,若是犯了一點點錯誤,就會讓整本書質量變低同樣。
我寫地越清楚,先後越一致,你閱讀此書的體驗將越好。但我不是一個天衣無縫的做者。有些章節可能比另一些寫的好。可是那些有待提升的章節不會使書中寫的好的部分黯然失色。
一樣的道理也適用於代碼。隨着你愈來愈多的使用函數式編程的模式,你的代碼質量會愈來愈高。25% 的時間使用它們,你會獲得一些好處。80% 的時間使用它們,你將收益更多。
除了幾處僅存的特例,你不會在本書裏看到不少絕對的論斷。咱們討論的是要追求的目標和現實中方方面面的權衡。
歡迎來到最實用的函數式編程的學習之旅。咱們將共同探討學習!
【下一章】翻譯連載 |《JavaScript 輕量級函數式編程》- 第 1 章:爲何使用函數式編程?
iKcamp原創新書《移動Web前端高效開發實戰》已在亞馬遜、京東、噹噹開售。