摘要:函數(shù)式編程不是用函數(shù)來編程,其主旨是將復(fù)雜的函數(shù)轉(zhuǎn)化為簡單的函數(shù)。所以下面用我一年級的智商對函數(shù)式編程的理解,來介紹一些函數(shù)式編程的知識和概念。
引言
javascript是一門多范式編程語言,什么叫多范式?通俗一點來講,不管是爛大街的面向?qū)ο螅€是面向切面、函數(shù)式編程啥都能寫。函數(shù)式編程不是用函數(shù)來編程,其主旨是將復(fù)雜的函數(shù)轉(zhuǎn)化為簡單的函數(shù)。這兩年隨著React的火熱,函數(shù)式編程的概念也開始流行起來,RxJS、cycleJS、lodashJS、underscoreJS等多種開源庫都使用了函數(shù)式的特性,但是相信絕大部分人看完有關(guān)函數(shù)式編程的書籍,還是一臉懵逼。所以下面用我一年級的智商對函數(shù)式編程的理解,來介紹一些函數(shù)式編程的知識和概念。
純函數(shù)純函數(shù)的定義是,對于相同的輸入,永遠會得到相同的輸出,而且沒有任何可觀察的副作用,也不依賴外部環(huán)境的狀態(tài)。
var xs = [1,2,3,4,5]; // 純的 xs.slice(0,3); //=> [1,2,3] // 不純的,改變了原數(shù)組的值 xs.splice(0,3); //=> [1,2,3]
大多數(shù)有用的純函數(shù)都應(yīng)有至少一個參數(shù)。所有有用的純函數(shù)都應(yīng)該返回一些東西。
let addNoReturn = (x, y) => { let z = x+ y } //無用的純函數(shù)
現(xiàn)在你可以嘗試打開瀏覽器的控制臺,執(zhí)行這樣一個函數(shù)
let add = (x, y) => x + y add(1, 2) //3
執(zhí)行一次,結(jié)果是3。
現(xiàn)在你可以再次執(zhí)行一次
add(1, 2) //3
結(jié)果還是3,再執(zhí)行一次
add(1, 2) //3
結(jié)果還是3,驚不驚喜,意不意外?
再看下面一個函數(shù)
let wirteFile = (x) => { localStorage.setItem("font", "1") return x; }
這個是純函數(shù)嗎,相同的結(jié)果也是相同的輸出啊?
顯然這個不是純函數(shù),純函數(shù)不能修改任何外部變量,純函數(shù)沒有函數(shù)副作用。
副作用可能包含,但不限于:
更改文件系統(tǒng)
往數(shù)據(jù)庫插入記錄
發(fā)送一個 http 請求
打印/log
DOM 查詢
看到這里你可能會把我拉黑,只有純函數(shù)我還怎么寫代碼,怎么完成需求?
在函數(shù)式編程中,你不僅僅編寫純函數(shù)。
函數(shù)式語言不能消除函數(shù)副作用,它們只能限制函數(shù)副作用。因為程序必須和真實世界交互,每一個程序總有一些部分必須是不純的。目標(biāo)是減少不純代碼的數(shù)量并將它們和我們程序中的其他部分隔離。
純函數(shù)不僅降低了系統(tǒng)的復(fù)雜度,還有很多很棒的特性,比如可緩存性
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)
我們不用每次都自己實現(xiàn)memorize函數(shù),lodash、ramda都提供了很好的封裝。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/82890.html
摘要:函數(shù)式編程,一看這個詞,簡直就是學(xué)院派的典范。所以這期周刊,我們就重點引入的函數(shù)式編程,淺入淺出,一窺函數(shù)式編程的思想,可能讓你對編程語言的理解更加融會貫通一些。但從根本上來說,函數(shù)式編程就是關(guān)于如使用通用的可復(fù)用函數(shù)進行組合編程。 showImg(https://segmentfault.com/img/bVGQuc); 函數(shù)式編程(Functional Programming),一...
摘要:聲明式編程一種編程范式,與命令式編程相對立。常見的聲明式編程語言有數(shù)據(jù)庫查詢語言,正則表達式邏輯編程函數(shù)式編程組態(tài)管理系統(tǒng)等。函數(shù)式編程,特別是純函數(shù)式編程,嘗試最小化狀態(tài)帶來的副作用,因此被認為是聲明式的。 編程范式與函數(shù)式編程 一、編程范式的分類 常見的編程范式有:函數(shù)式編程、程序編程、面向?qū)ο缶幊?、指令式編程等。在面向?qū)ο缶幊痰氖澜纾绦蚴且幌盗邢嗷プ饔茫ǚ椒ǎ┑膶ο螅–lass...
摘要:所以我覺得函數(shù)式編程領(lǐng)域更像學(xué)者的領(lǐng)域。函數(shù)式編程的原則是完善的,經(jīng)過了深入的研究和審查,并且可以被驗證。函數(shù)式編程是編寫可讀代碼的最有效工具之一可能還有其他。我知道很多函數(shù)式編程編程者會認為形式主義本身有助于學(xué)習(xí)。 原文地址:Functional-Light-JS 原文作者:Kyle Simpson?。 禮ou-Dont-Know-JS》作者 關(guān)于譯者:這是一個流淌著滬江血液...
摘要:函數(shù)式編程的準(zhǔn)則不依賴于外部的數(shù)據(jù),而且也不改變外部數(shù)據(jù)的值,而是返回一個新的值給你。函數(shù)式編程利用純函數(shù)的無狀態(tài)性,它的好處非常多結(jié)果可預(yù)期利于測試利于復(fù)用利于并發(fā),但一個系統(tǒng)工程的代碼,是不可能全部采用純函數(shù)來寫的。 什么是函數(shù)式編程 函數(shù)式編程是一種編程范式,常見的編程范式有以下三種: 命令式編程 聲明式編程 函數(shù)式編程 函數(shù)式編程的本質(zhì)是將計算描述為一種表達式求值。在函數(shù)式...
摘要:今天這篇文章主要介紹函數(shù)式編程的思想。函數(shù)式編程通過最小化變化使得代碼更易理解。在函數(shù)式編程里面,組合是一個非常非常非常重要的思想??梢钥吹胶瘮?shù)式編程在開發(fā)中具有聲明模式。而函數(shù)式編程旨在盡可能的提高代碼的無狀態(tài)性和不變性。 最開始接觸函數(shù)式編程的時候是在小米工作的時候,那個時候看老大以前寫的代碼各種 compose,然后一些 ramda 的一些工具函數(shù),看著很吃力,然后極力吐槽函數(shù)式...
摘要:函數(shù)式編程的哲學(xué)就是假定副作用是造成不正當(dāng)行為的主要原因。函數(shù)組合面向?qū)ο笸ǔ1槐扔鳛槊~,而函數(shù)式編程是動詞。尾遞歸優(yōu)化函數(shù)式編程語言中因為不可變數(shù)據(jù)結(jié)構(gòu)的原因,沒辦法實現(xiàn)循環(huán)。 零、前言 說到函數(shù)式編程,想必各位或多或少都有所耳聞,然而對于函數(shù)式的內(nèi)涵和本質(zhì)可能又有些說不清楚。 所以本文希望針對工程師,從應(yīng)用(而非學(xué)術(shù))的角度將函數(shù)式編程相關(guān)思想和實踐(以 JavaScript 為...
閱讀 1527·2021-11-24 09:38
閱讀 3376·2021-11-18 10:02
閱讀 3266·2021-09-22 15:29
閱讀 2950·2021-09-22 15:15
閱讀 1054·2021-09-13 10:25
閱讀 1869·2021-08-17 10:13
閱讀 2003·2021-08-04 11:13
閱讀 1985·2019-08-30 15:54