(譯) 函數式 JS #1:簡介

written equations on brown wooden board
「written equations on brown wooden board」 by Roman Mager on Unsplash

原文連接 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)編程,等等。

我贊成其中大部份內容。我不想再重複相同的論點,因此我但願你看一下上面的一些連接。

不過,我接下來要講的是另一些東西。我會告訴你爲何要考慮學習函數式編程。我會分享一下個人收穫,那也可能將是你的收穫。

1. 它正在成爲主流

若是你看一下不斷變化的 JS 生態,很明顯能夠看出來函數式編程實踐已經日益普及。大量很是酷的新框架和庫都受到了 FP 的重大影響, 例如:

  • React -- 可重用的組件和純函數
  • Redux -- 強迫你不要使用可變狀態
  • Reason -- 函數式方法和不變性
  • Elm -- 能夠編譯成 JavaScript 的函數式語言
  • Underscore.jslodashRamda -- 這幾個庫都內置了 FP

你可能已經或者將要使用這些工具之一。若是你很好地理解了函數式編程的概念,那麼你能夠更快地掌握這些框架和庫。不然你可能要多花一些時間。

2. 這頗有挑戰性

離開大學以後,你的大腦是否是再也沒有像在學校時那樣全速運轉過了?

我確定有過。個人意思是,個人工做充滿了挑戰。我花了不少時間思考:業務問題,系統架構,團隊狀態以及許多其餘東西。

這並非說跟上微積分課同樣。學那個的時候我須要絞盡腦汁來理解全部的概念,以及它們之間如何相互關聯。

嗯,學習函數式編程的感受其實有點兒相似。這也不奇怪,畢竟函數式編程就是來源於數學。

學習過程當中會有不少新的術語,理解這些知識可能會讓你頭暈眼花。可是在醍醐灌頂的時刻,你會體會到極大的知足。

我相信若是你在大學裏喜歡數學,那你確定也會喜歡學習這些東西的。

哦……這個說法可能不會讓你愛上函數式編程的,對吧?

3. 這是一個新鮮的東西

我相信,即便你不打算在平常工做中切換到函數式編程,學習新的編程範式也是大有好處的。不只僅是由於這是一個挑戰 -- 更是由於它感受 很不同

嘗試新的編碼風格可讓你接觸到另外一種大相徑庭的作事方法。也會迫使你從不一樣的角度思考問題。

你可能會認爲多花一些時間在已經熟練掌握的工具上面更划算。我知道那樣收效更快,更務實,可讓你的在那些你熟悉的技術上鑽得更

但我相信,做爲軟件開發者,咱們也須要拓咱們的視野。它有助於咱們更好地與其餘開發人員溝通,特別是當他們跟咱們背景不一樣的時候。從不一樣的角度來看問題,能夠幫助咱們作出更好的決策。

學習新的編程語言是拓寬專業知識的好方法。可是學習新的編程範式更好。

好的,但……爲何是 JavaScript?

若是你已經決定要學習FP,那麼下一個問題就是:使用 JavaScript 是一個很好的方式嗎?

首先我得說 JavaScript 可能不是學習函數式編程概念的最佳途徑。緣由大概有如下這些。

其餘更加函數式的語言,內置了不可變數據結構. 而 JavaScript 沒有,所以你須要額外使用一個庫。這樣以來,你的代碼會比較冗長。

JavaScript 試圖模仿 Java,例如它的 classnew,以及其餘一些相似的東西。

JavaScript標準庫很糟糕。它固然不是考慮到爲 FP 概念而設計的。

關於 JS 是否是函數式編程的最佳選擇,還有不少爭論。

可是另外一方面,JavaScript 也有不少特性有助於實現函數式編程:

  • 函數在 JS 裏是一等公民 (First-class functions)
  • 閉包 (Closures)
  • 對象和數組字面量 (Object and Array Literals) (譯註:參考)
  • 大量的 FP 庫

此外,我認爲最重要的一點是:JavaScript 很是流行,而且會愈來愈流行。

若是你打算使用 JavaScript,爲何不嘗試學習一種很是有用的新範式呢?

讓咱們開始吧!

在本系列的下一部分中,我將介紹一些 FP 概念 - 從最基本的概念開始。我打算涵蓋如下幾個方面:

  • 純函數(pure function),一等公民的函數 (first-class functions),高階函數 (Higher-order functions)
  • 共享狀態(shared state),不變性(Immutability),反作用(Side effects),引用透明(Referential transparency)
  • 閉包(Closures)
  • 局部調用(Partial application),柯里化(Currying)
  • 遞歸(Recursion)
  • 組合(Composition),Point-free 風格
  • FP 庫
  • 涵子(Functors),Applicative Functors,Monads

我會假定你已經瞭解了 JavaScript 的基礎知識,ES6 等等。對於理解FP概念來講,這並非一個強制要求。可是,它可讓你更輕鬆地完成示例並本身作一些嘗試。

準備好了嗎,下一章是:「函數式 JS#2:函數」。

相關文章
相關標籤/搜索