函數化編程 百科定義: 函數化編程: 又稱泛函數編程,是一種編程泛式,它將電腦運算視為數學上的函數計算,並且避免使用程式狀態以及易變對象。 簡單理解,以函數為單元,對複雜邏輯進行拆分,將複雜邏輯轉化為多個簡單函數邏輯,同時通過對函數進行層層調用,來達到最終目的。 特點: 函數可以作為參數傳入,也可以 ...
函數化編程
百科定義:
函數化編程: 又稱泛函數編程,是一種編程泛式,它將電腦運算視為數學上的函數計算,並且避免使用程式狀態以及易變對象。
簡單理解,以函數為單元,對複雜邏輯進行拆分,將複雜邏輯轉化為多個簡單函數邏輯,同時通過對函數進行層層調用,來達到最終目的。
特點: 函數可以作為參數傳入,也可以作為返回值返回。
1. 純函數 && 非純函數
定義: 輸入一個x產生輸出一個唯一y值
特點:
1. 輸入相同的值時,輸出也是一樣的,不受外部環境影響
2. 運行時,無副作用,不對外部環境產生影響
例子:
Array.prototype.slice;
function add(a) {
return a+1
}
add(1)
add(1)
那麼非純函數則是正好相反:易受外部環境影響,提高了系統複雜性。
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;
}
純函數是函數編程的基礎,那麼如何將非純函數轉化為純函數呢?
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. 聲明式語句 && 命令式語句
顧名思義,命令式語句是,一步一步的指令,告訴你要怎麼做,而聲明式語句,則是只需要說要什麼,具體怎麼做,你自己看著辦
命令式:
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函數化編程有了一個較為基礎的淺顯的認識,至於更深層次的認識,就需要看看其他大佬的文章了。