函數化編程

函數化編程

百科定義:
函數化編程: 又稱泛函數編程,是一種編程泛式,它將電腦運算視爲數學上的函數計算,而且避免使用程序狀態以及易變對象。
簡單理解,以函數爲單元,對複雜邏輯進行拆分,將複雜邏輯轉化爲多個簡單函數邏輯,同時經過對函數進行層層調用,來達到最終目的。
特色: 函數能夠做爲參數傳入,也能夠做爲返回值返回。編程

1. 純函數 && 非純函數

定義: 輸入一個x產生輸出一個惟一y值
特色:
1. 輸入相同的值時,輸出也是同樣的,不受外部環境影響
2. 運行時,無反作用,不對外部環境產生影響函數

例子: 
      Array.prototype.slice;
      function add(a) {
        return a+1
      }
      add(1)
      add(1)

那麼非純函數則是正好相反:易受外部環境影響,提升了系統複雜性。prototype

var arr = [1, 3, 5, 6];
    arr.splice(0,1) ==> [1]
    arr.splice(0,1) ==> [3]
    var b = 34;
    function add(a) {
      return a + b;
    }

純函數是函數編程的基礎,那麼如何將非純函數轉化爲純函數呢?code

2. 函數柯里化(curry)

簡單的定義就是:將一個低階函數轉化爲高階函數的過程被稱之爲柯里化。
這樣說未免有點不太清楚,就是將一個須要傳入多個參數的函數轉化爲多個只須要傳入一個參數的函數。對象

如: 
      function (arg1, arg2, arg3) ==> function(arg1)(arg2)(arg3)
      
      function add(a, b){
        return a+b
      }
      add(1,2)
      ==> 
      function add(a) {
        return function(b){
          return a+b;
        }
      }
      add(1)(2)

這樣一看是否是就清楚的多了,其中有提到一個概念高階函數,那麼什麼是高階函數呢?
高階函數: "Higher-order function",js中的函數都是指向某個變量的,那麼一樣能夠指向某個函數,同理,也能夠將某個函數做爲返回值,返回。
所謂的高階函數,就是能夠接受一個函數爲參數或返回一個函數的函數。數學

例子: 
      var arr = [1,2,34]
      arr.map(function(item, index){
        return item*2
      })
      
      function add(a, b, fn){
        return fn(a) + fn(b)
      }
3. 聲明式語句 && 命令式語句

顧名思義,命令式語句是,一步一步的指令,告訴你要怎麼作,而聲明式語句,則是隻須要說要什麼,具體怎麼作,你本身看着辦it

命令式:
    var arr = [1, 2, 4, 5],result = [];
    for(var i = 0; i< arr.length; i++) {
      result.push(arr[i])
    }
  
  聲明式:
    var result = arr.map(function(item){return item})
  從這兩個例子,就能夠清楚的看到命令式語句和聲明式語句的區別了

經過上面的內容,已經對js函數化編程有了一個較爲基礎的淺顯的認識,至於更深層次的認識,就須要看看其餘大佬的文章了。io

相關文章
相關標籤/搜索