在JS中實踐函數式編程【2】 -- 基本概念

寫在文章前

鹹魚了好久,終於失蹤人口迴歸。今天的函數式編程是函數式系列的第二彈。在瞭解真正如何實現函數式編程以前咱們仍是先了解一些專業詞彙方便後續的理解。javascript

文章若是有什麼不對的地方歡迎在評論區批評指正。java

函數

函數式編程,函數式編程,最基本的構成天然是函數。比起其餘普通的函數,咱們實際上是更關注數學上的功能。編程

函數若是從數學的理論上是一個給定輸入產生輸出的一個"東西"。可是在函數式編程中要求,在給定輸入的時候,有且只有惟一輸出. 這就意味着若是咱們在傳參相同的狀況下,咱們但願,函數可以實現相同的功能,返回相同的值。 這聽起來好像很容易的亞子,但這就硬性的要求了。數組

  • 函數只能依賴輸入參數
  • 返回值只返回單一的值。
  • 返回值是肯定性的,不能使用隨機值。

這種一心只愛一我的的函數被叫作純函數。數據結構

像極了優秀男人的純函數

咱們來舉幾個不是純函數的🌰。dom

🌰1 :編程語言

function number(num) {
    return Math.random() % 2 === 0 ? 'even' : 'odd';
}
複製代碼

上面這個函數就不純,由於在給定傳參的狀況下,他不會有肯定的返回值返回。它違反了肯定性的原則。ide

再舉個🌰:函數式編程

let a = 'aaa';
function joinAandB(b){
    return `${a} ${b}`
};
複製代碼

這個函數也不是純函數,由於他依賴了一個函數外的變量,這會致使返回值的結果會在外部依賴更改的狀況下,也會更改。咱們無法肯定他老是返回相同的值。函數

再舉個🌰

function calculateAdd(a, b) {
    return a + b;
}
複製代碼

上面的這個加法計算函數就是純函數,他不會依賴其餘外部變量,在給定傳參的時候,他有惟一的返回值。

總得來講,函數純不純不看溶質佔溶液的百分比,而看他的功能性是否是肯定的,他是否是自力更生的,他是否是從一而終的。這個純函數就是函數中的好男人,遇到這種好男人,固然選擇愛他。

爲啥有這樣的要求?

爲何要這樣嚴格的限定輸入輸出?自由民主的空氣很差嗎🐶?

其實嚴格的限定仍是有好處的:

  1. 可讀性高
  2. 出錯方便定位
  3. 更容易測試

由於函數的功能是保持單一的,因此咱們只須要看函數體就知道這個函數式作什麼的。並且由於沒有外部依賴,咱們會更容易的定位到出錯緣由。聽起來很美好,可是其實咱們能夠預想到要真的作到徹底的純函數是不可能。這個緣由咱們以後在分析,在此以前,咱們首先先了解一下兩個概念: 一階函數和高階函數。

頭等函數

其實頭等函數並非在真正的業務代碼中總被使用的函數,但在某些狀況下咱們仍是有必要使用頭等函數的。

那到底什麼是頭等函數?頭等函數就是當一個編程語言的函數能夠像任何其餘的變量時,咱們就認爲該語言擁有頭等函數。頭等函數能夠被傳遞,能夠被賦值,能夠存儲任何複雜的數據結構好比對象或者數組。總而言之就是頭等函數堪比一些值類型,他變了,變得不像個函數了。

js中的函數是頭等函數,這也就解釋了爲何函數的種種使用都很像對象。

function calculator = {
    add,
    multiple,
    decrease,
    devide
};
function add (a,b){
    return a + b;
}
複製代碼

但咱們確定會有個疑問,爲何函數要有這樣的形式。無論其餘的官方理由,反正在函數式編程中,這是爲了實現另外一種函數形式: 高階函數。

高階函數

對於能夠更改其餘函數的函數就是高階函數,咱們會使用其餘函數做爲參數,或者咱們會將函數做爲返回值。

其實javascript中就已經實踐不少高階函數,好比,sort函數,好比map函數,filter,foreach等全部傳入函數的函數都是高階函數。js中那些內置的高階函數都限定了返回值必須是函數,由於他們就是用來操做函數的。

function produceName(firstname){
    return function addLastName(lastname) {
        return `${lastname} ${firstname}`
    }
}

const firstname = produceName('alice');
const name = firstname('Smith');
複製代碼

咱們知道了如何將函數做爲參數進行傳入,那上面的例子就說明了如何將函數做爲返回值返回。高階函數就是操做函數的函數,也是函數式編程的精華所在。

總結

說白了函數式編程就是將許多複雜的功能,拆分紅具備原子性,可肯定性,以及不依賴其餘模塊的一些"微函數"。因此最後將這些函數組合的時候,就是頻繁使用高階函數的時候。

【PS】公司依舊還在招聘,須要內推的小夥伴歡迎私戳。

相關文章
相關標籤/搜索