煙霧的方塊藝術 —MattysFlicks —(CC BY 2.0)javascript
注意:這是從基礎學習函數式編程和使用 JavaScript ES6+ 編寫軟件的第一部分。保持關注,接下來還有不少!前端
當我 6 歲時,我花了不少時間跟個人小夥伴玩電腦遊戲,他家有一個裝滿電腦的房間。對於我說,它們有不可抗拒的魔力。我花了不少時間探索全部的遊戲。一天我問他,「咱們怎樣作一個遊戲?」java
他不知道,因此咱們問了他的老爸,他的老爸爬上一個很高的架子拿下來一本使用 Basic 編寫遊戲的書籍。就那樣開始了個人編程之路。當公立學校開始教授代數時,我已經熟稔其中的概念了,由於編程基本上是代數。不管如何,它都是。react
在計算機科學的起步階段,在大多數的計算機科學在電腦上完成以前,有兩位偉大的計算機科學家:阿隆佐·邱奇和艾倫·圖靈。他們發明了兩種不一樣、可是廣泛通用的計算模型。兩種均可以計算全部可被計算的東西(所以,「廣泛」)。android
阿隆佐·邱奇發明了 lambda 表達式。lambda 表達式是基於函數應用的通用計算模型。艾倫·圖靈由於圖靈機而知名。圖靈機使用定義一個在磁帶上操做符號的理論裝置來計算的通用模型。ios
總的說,他們共同說明了 lambda 表達式和圖靈機功能上是相等的。git
lambda 表達式全是函數組成,依靠函數來編寫軟件是很是高效和有意義的。本文中,咱們將會討論軟件設計中函數的組合的重要性。github
有三點造就了 lambda 表達式的特別之處:編程
const sum = (x, y) => x + y
的右側,能夠看做一個匿名函數表達式 (x, y) => x + y
。(x, y) => x + y
能夠被表示爲一個像 x => y => x + y
的一元函數。這個把多元函數轉換成一元函數的過程叫作柯里化。總的說來,這些特性造成一個簡單且具備表達性的方法來構造軟件,即便用函數做爲初始模塊。在 JavaScript 中,函數的匿名和柯里化都是可選的特性。雖然 JavaScript 支持這些 lambda 表達式的重要屬性,它卻並不強制使用這些。後端
這些經典的函數組合方法用一個函數的輸出來做爲另外一個函數的輸入,例如,對於組合:
f . g複製代碼
也能夠寫作:
compose2 = f => g => x => f(g(x))複製代碼
這裏是你使用它的方法:
double = n => n * 2
inc = n => n + 1
compose2(double)(inc)(3)複製代碼
compose2()
函數使用 double
函數做爲第一個參數,使用 inc
函數做爲第二個參數,同時對於兩個函數的組合傳入參數 3
。再看一下 compose2()
函數所寫的,f
是 double()
,g
是 inc()
,同時 x
是 3
。函數 compose2(double)(inc)(3)
的調用,其實是三個不一樣函數的調用:
double
同時返回一個新的函數。inc
同時再返回一個新的函數。3
同時計算 f(g(x))
,最後其實是 double(inc(3))
。x
等於 3
同時傳給 inc()
。inc(3)
等於 4
。double(4)
等於 8
。8
。組合軟件時,能夠被看做一個由函數組合的圖。看一下下面:
append = s1 => s2 => s1 + s2
append('Hello, ')('world!')複製代碼
你能夠想象成這樣:
lambda 表達式對軟件設計產生了很大的影響,在 1980 年以前,計算機科學領域不少有影響的東西使用函數來構造軟件。Lisp 在 1958 年被創做出來,很大程度上受到了 lambda 表達式的影響。現在,Lisp 是普遍使用的第二老的語言了。
我經過 AutoLISP:一個做爲腳本語言被用於最流行的計算機輔助設計(CAD)軟件:AutoCAD,接觸到它。AutoCAD 很流行,實際上全部其餘的 CAD 軟件都兼容支持 AutoLISP。Lisp 由於如下三點緣由被普遍做爲計算機科學的課程:
在 1970 到 1980 中間的某段時間,軟件的構造開始偏離簡單的組合,成爲一串線性的讓計算機執行的指令。而後面向對象編程 — 一個偉大的關於組件的封裝和信息傳遞的思想被流行的編程語言扭曲了,變成爲了特性的重用所採起的糟糕的繼承層次和 is-a 關係。
函數式編程語言退居二線:只有編程極客的癡迷、常春藤盟校的教授和一些幸運的學生能夠在 1990 — 2010 年間逃離 Java 的強迫性學習。
對於咱們的大多數人來講,已經經歷了大約 30 年的軟件編寫噩夢和黑暗時期。
在 2010 年左右,一些有趣的事情發生了:JavaScript 的崛起。在大概 2006 年之前,JavaScript 被普遍的看做玩具語言和被用製做瀏覽器中好玩的動畫,可是它裏面隱藏着一些極其強大的特性。即 lambda 表達式中最重要的特性。人們開始暗中討論一個叫作 「函數式編程的」 酷東西。
我一直在告訴你們 #JavaScript 並非一門玩具語言。如今我須要展現它。
在 2015 年,使用函數的組合來編寫軟件又開始流行起來。爲了更簡單化,JavaScript 規範得到的數十年來第一次主要的更新而且添加了箭頭函數,爲了更簡單的編寫和讀取函數、柯里化,和 lambda 語句。
箭頭函數像是 JavaScript 函數式編程飛昇的燃料。如今不多看見不使用不少函數式編程技術的大型應用了。
組合型能夠簡單、優雅的表達軟件的模型和行爲。經過把小的、肯定的函數組合成稍大的組件並構成軟件的過程,能夠更爲簡單的組織、理解、調試、擴展、測試和掌控。
你在閱讀下一部分時,可使用實例實驗,記住要把你本身當孩子同樣把其餘的思想扔在一邊在學習中去探索和玩耍。從新發現孩童時發現新事物的欣喜。讓咱們來作一些魔術吧。
接下來的第二部分:「爲何要用 JavaScript 學習函數式編程?」
想更多的學習 JavaScript 的函數式編程?
Learn JavaScript with Eric Elliott,什麼,你尚未參加,out 了!
Eric Elliott 是 「Programming JavaScript Applications」 (O’Reilly) 和 「Learn JavaScript with Eric Elliott」 的做者。他曾效力於 Adobe Systems, Zumba Fitness, he Wall Street Journal, ESPN, BBC, and top recording artists including Usher, Frank Ocean, Metallica 和其餘一些公司。
他和她的老婆(很漂亮)大部分時間都在舊金山灣區裏。
掘金翻譯計劃 是一個翻譯優質互聯網技術文章的社區,文章來源爲 掘金 上的英文分享文章。內容覆蓋 Android、iOS、React、前端、後端、產品、設計 等領域,想要查看更多優質譯文請持續關注 掘金翻譯計劃。