函式柯里化是將接受多個引數的函式轉換成可以接受乙個引數的函式,且轉換後的函式能夠處理剩餘引數並返回執行結果。
以下**是對乙個求和函式進行柯里化處理後的效果:
// 接受多個引數的函式
function
add(a, b, c)
// 經過柯里化處理後生成函式_add
var _add =
curry
(add)
// _add可以接受乙個引數,且能夠處理剩餘引數並返回執行結果
_add(1
)(2)
(3)// 6
求和函式add原本可以接收三個引數進行求和,經過柯里化處理後生產乙個_add函式,我們可以對_add函式逐個傳參,最終輸出求和結果
那麼如何實現上面例子中的curry函式呢?
首先先對函式柯里化過程中做了些啥進行分析:1、柯里化處理的物件是函式,說明curry函式的引數得是個函式;2、經過柯里化處理的函式,它可以多次呼叫,說明curry函式內部會多次return乙個函式;3、多次呼叫後會將所有的引數執行並返回最終結果
經過上面簡單的分析,可以動手實現一下curry函式,**如下:
function
curry
(fn, args)
// 當收集的引數的個數等於fn的形參個數時,返回執行結果
return fn.
(this
, _args)
}}
對上面的**進行測試:
_add(1
)(2)
(3)// 6
_add(2
)(3)
(4)// 9
上述就是函式柯里化的簡單實現
總結:函式柯里化是將接受多個引數的函式轉換成每次接受乙個引數的函式,轉換後的函式能夠處理剩餘引數並返回最終執行結果;
函式柯里化主要做了兩個工作,分別是:1、收集引數;2、執行函式;
函式柯里化利用了閉包對多次呼叫的傳參進行儲存,並通過判斷收集引數的個數與執行函式的形參個數是否相等,來決定函式是否繼續柯里化,繼續柯里化的時候採用了遞迴的方式;
在柯里化過程中可以看出,通過遞迴可以持續柯里化,最終會有乙個臨界條件來讓柯里化停止,並執行函式返回結果,上面例子中的臨界條件就是對比收集引數的個數與執行函式引數的個數;
最後,將收集的引數代入執行函式中返回最終結果;
[1] 前端基礎高階(八):深入詳解函式的柯里化
JavaScript中的函式
函式的宣告 方式一 js的 宣告區域和執行區域是一起的,都是在js 的 域中 function 函式名 形參名 1,形參名2 function test1 a1,a2 test1 1 2 方式二 根據底層都是物件,函式底層也都是物件 var 函式名 new function 形參1 形參2 函式體 ...
Python中的函式柯里化
python中的函式柯里化 乙個函式有多個引數,我們希望能固定其中幾個引數的值。from functools import partial deffoo a,b,c return a b c foo2 partial foo,b 2 foo2 a 1,c 3 6看上去這跟提供引數預設值的情況類似。但...
Swift中的柯里化函式
柯里化函式是把接受多個引數的函式變換成接受乙個單一引數 最初函式的第乙個引數 的函式,並且返回接受餘下的引數而且返回結果的新函式。func sum a int,b int int sum 1,2 輸出3swift中書寫柯里化函式 fun function parameters parameters ...