天天看點

JavaScript函數柯裡化

javascript是以函數為一等公民的函數式語言。函數在javascript中也是一個對象(繼承制function),函數也可以作為參數傳遞成函數變量。最近幾年函數式也因為其無副作用的特性、透明性、惰性計算等在高并發,大資料領域火起來了。

javascript中也有如underscore、lodash之類的函數式庫,如lodash的使用方式:

今天文章将以高階函數中的柯裡化方式來,看看javascript的函數式能力。

在計算機科學中,柯裡化(currying)是把接受多個參數的函數變換成接受一個單一參數(最初函數的第一個參數)的函數,并且傳回接受餘下的參數且傳回結果的新函數的技術。這個技術由 christopher strachey 以邏輯學家 haskell curry 命名的,盡管它是 moses schnfinkel 和 gottlob frege 發明的。

在理論計算機科學中,柯裡化提供了在簡單的理論模型中比如隻接受一個單一參數的lambda 演算中研究帶有多個參數的函數的方式。

下邊的例子,我們将把柯裡化方式泛化為接受任意個參數,直到聲明的方法參數個數飽和才執行,是以根據參數個數可以有多種柯裡化函數産生。

代碼如下:

首先上面會利用正則來擷取傳入函數的參數個數。再傳回一個函數的代理,每次的調用都會将傳入參數緩存在args臨時變量中,直到參數個數飽和才會立即執行。代碼比較冗長,慢慢品味,當然有不足之處,也希望大家指出來。

繼續閱讀