摘要:函數式編程不是用函數來編程,其主旨是將復雜的函數轉化為簡單的函數。所以下面用我一年級的智商對函數式編程的理解,來介紹一些函數式編程的知識和概念。
引言
javascript是一門多范式編程語言,什么叫多范式?通俗一點來講,不管是爛大街的面向對象,還是面向切面、函數式編程啥都能寫。函數式編程不是用函數來編程,其主旨是將復雜的函數轉化為簡單的函數。這兩年隨著React的火熱,函數式編程的概念也開始流行起來,RxJS、cycleJS、lodashJS、underscoreJS等多種開源庫都使用了函數式的特性,但是相信絕大部分人看完有關函數式編程的書籍,還是一臉懵逼。所以下面用我一年級的智商對函數式編程的理解,來介紹一些函數式編程的知識和概念。
純函數純函數的定義是,對于相同的輸入,永遠會得到相同的輸出,而且沒有任何可觀察的副作用,也不依賴外部環境的狀態。
var xs = [1,2,3,4,5]; // 純的 xs.slice(0,3); //=> [1,2,3] // 不純的,改變了原數組的值 xs.splice(0,3); //=> [1,2,3]
大多數有用的純函數都應有至少一個參數。所有有用的純函數都應該返回一些東西。
let addNoReturn = (x, y) => { let z = x+ y } //無用的純函數
現在你可以嘗試打開瀏覽器的控制臺,執行這樣一個函數
let add = (x, y) => x + y add(1, 2) //3
執行一次,結果是3。
現在你可以再次執行一次
add(1, 2) //3
結果還是3,再執行一次
add(1, 2) //3
結果還是3,驚不驚喜,意不意外?
再看下面一個函數
let wirteFile = (x) => { localStorage.setItem("font", "1") return x; }
這個是純函數嗎,相同的結果也是相同的輸出啊?
顯然這個不是純函數,純函數不能修改任何外部變量,純函數沒有函數副作用。
副作用可能包含,但不限于:
更改文件系統
往數據庫插入記錄
發送一個 http 請求
打印/log
DOM 查詢
看到這里你可能會把我拉黑,只有純函數我還怎么寫代碼,怎么完成需求?
在函數式編程中,你不僅僅編寫純函數。
函數式語言不能消除函數副作用,它們只能限制函數副作用。因為程序必須和真實世界交互,每一個程序總有一些部分必須是不純的。目標是減少不純代碼的數量并將它們和我們程序中的其他部分隔離。
純函數不僅降低了系統的復雜度,還有很多很棒的特性,比如可緩存性
const memorize = f => { const cache = {}; return function() { const arg_str = JSON.stringify(arguments); cache[arg_str] = cache[arg_str] || f.apply(f, arguments); return cache[arg_str]; }; }; const addNumber = memorize( x => x + 1) //第一次計算慢 addNumber(1) //第二次有了緩存,速度快了不少 addNumber(1)
我們不用每次都自己實現memorize函數,lodash、ramda都提供了很好的封裝。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/82890.html
摘要:函數式編程,一看這個詞,簡直就是學院派的典范。所以這期周刊,我們就重點引入的函數式編程,淺入淺出,一窺函數式編程的思想,可能讓你對編程語言的理解更加融會貫通一些。但從根本上來說,函數式編程就是關于如使用通用的可復用函數進行組合編程。 showImg(https://segmentfault.com/img/bVGQuc); 函數式編程(Functional Programming),一...
摘要:聲明式編程一種編程范式,與命令式編程相對立。常見的聲明式編程語言有數據庫查詢語言,正則表達式邏輯編程函數式編程組態管理系統等。函數式編程,特別是純函數式編程,嘗試最小化狀態帶來的副作用,因此被認為是聲明式的。 編程范式與函數式編程 一、編程范式的分類 常見的編程范式有:函數式編程、程序編程、面向對象編程、指令式編程等。在面向對象編程的世界,程序是一系列相互作用(方法)的對象(Class...
摘要:所以我覺得函數式編程領域更像學者的領域。函數式編程的原則是完善的,經過了深入的研究和審查,并且可以被驗證。函數式編程是編寫可讀代碼的最有效工具之一可能還有其他。我知道很多函數式編程編程者會認為形式主義本身有助于學習。 原文地址:Functional-Light-JS 原文作者:Kyle Simpson - 《You-Dont-Know-JS》作者 關于譯者:這是一個流淌著滬江血液...
摘要:今天這篇文章主要介紹函數式編程的思想。函數式編程通過最小化變化使得代碼更易理解。在函數式編程里面,組合是一個非常非常非常重要的思想。可以看到函數式編程在開發中具有聲明模式。而函數式編程旨在盡可能的提高代碼的無狀態性和不變性。 最開始接觸函數式編程的時候是在小米工作的時候,那個時候看老大以前寫的代碼各種 compose,然后一些 ramda 的一些工具函數,看著很吃力,然后極力吐槽函數式...
摘要:函數式編程的哲學就是假定副作用是造成不正當行為的主要原因。函數組合面向對象通常被比喻為名詞,而函數式編程是動詞。尾遞歸優化函數式編程語言中因為不可變數據結構的原因,沒辦法實現循環。 零、前言 說到函數式編程,想必各位或多或少都有所耳聞,然而對于函數式的內涵和本質可能又有些說不清楚。 所以本文希望針對工程師,從應用(而非學術)的角度將函數式編程相關思想和實踐(以 JavaScript 為...
閱讀 1512·2021-11-24 09:38
閱讀 3366·2021-11-18 10:02
閱讀 3253·2021-09-22 15:29
閱讀 2937·2021-09-22 15:15
閱讀 1037·2021-09-13 10:25
閱讀 1834·2021-08-17 10:13
閱讀 1971·2021-08-04 11:13
閱讀 1973·2019-08-30 15:54