JS高階函式-函式柯里化

Venler發表於2018-03-28

首先簡單介紹一下什麼是“函式柯里化”,在《javascript高階程式設計》這本書中有如下介紹:

與函式繫結緊密相關的主題是函式柯里化,它用於建立已經設定好的一個或者多個引數的函式。函式柯里化的基本方法和函式繫結是一樣的:使用一個閉包返回一個函式。兩者的區別在於,當函式被呼叫時,返回的函式還需要設定一些傳入的引數。

我們來通俗易懂的理解一下,既然是“函式柯里化”,我們首先得需要一個函式,然後再來想辦法來“柯里化”它,所以我們先建立一個簡單的函式add

function add(num1,num2){
    return num1 + num2;
}
複製程式碼

柯里化的目標是:建立已經設定好的一個或者多個引數的函式,所以接下來建立一個函式,這個函式需要使用閉包返回一個已經設定好的一個或者多個引數的函式,取名curry

function curry(fn){
    return function(){
        
    }
}
複製程式碼

此時的curry函式將用於“柯里化”我們剛剛建立的函式add,所以add函式將作為引數傳入curry中

接下來,我們來繼續完成curry函式,既然要固定一個或者多個引數,那麼該引數需隨add函式一起傳入curry中,由於固定的可以是一個或者多個,所以我們運用陣列的slice方法把它從引數列表中擷取出來

function curry(fn){
    var args = Array.slice.call(arguments,1);//第0位為fn,從第1位開始獲取後面所有引數
    return function(){
        
    }
}
複製程式碼

固定的引數擷取出來後,再獲取傳入引數,合併引數,傳入給add,返回add函式執行的結果

function curry(fn){
    var args = Array.prototype.slice.call(arguments,1);//第0位為fn,從第1位開始獲取後面所有引數
    return function(){
        var innerArgs = Array.prototype.slice.call(arguments);//獲取後傳入的引數
        var finalArgs = args.concat(innerArgs);//合併
        return fn.apply(null,finalArgs);
    }
}
複製程式碼

假設此時固定add方法第一個引數為數字5

var curridAdd = curry(add,5)

此時的curridAdd即為柯里化後的函式

curridAdd(2) //固定引數為5,傳入引數為2,結果為7

也可以固定2個引數

var curridAdd = curry(add,5,1)

curridAdd(2) //固定引數為5和1,無論傳入引數為多少,結果為6

至此一個簡單的柯里化函式curry實現了

相關文章