柯里化是指將使用多個引數的函式轉換成一系列使用乙個引數的函式的技術。柯里化的用途主要是引數復用,例如:
function
add(a, b)
add(1,2) //3
在柯里化之後或許可以這樣使用:
var addcurry = curry(add);
addcurry(1)(2); //3
或許針對這種簡單的將兩個數相加的場景,柯里化顯得有點多餘。但是如果我們想使用這個函式完成通用的事情,比如為所有的數加5,就可以使用addcurry(5)(x)
,使得將兩個數相加的函式有了通用性。
var curry = function
(func)
}
function
add(a, b)
varaddcurry = curry
(add,1,2);
addcurry(); //3
//或者
var addcurry = curry(add,1);
addcurry(2); //3
//或者
var addcurry = curry(add);
addcurry(1, 2) // 3
已經有柯里化的感覺了,但是還沒有達到要求,即此柯里化之後的函式只能被呼叫一次,不能實現addcurry(1)(2)
這樣的操作。
我們繼續進行改進。
比如說add這個函式接受兩個引數,那麼針對柯里化之後的函式,若傳入的引數沒有到達兩個的話,就繼續呼叫curry,繼續接受引數。若引數到達2個了,就直接呼叫add函式。
var curry = function
(func,args)else
}}
var addcurry = curry(add);
addcurry(1,2) //3
addcurry(1)(2) //3
但這一版柯里化函式仍然不能完全滿足要求,因為它只針對有特定引數個數的函式適用。
在前端面試中有乙個關於柯里化的面試題:
實現乙個add方法,使計算結果能夠滿足如下預期:
add(1)
(2)(3) = 6
add(1, 2, 3)
(4) = 10
add(1)
(2)(3)
(4)(5) = 15
我們之前寫的柯里化是不能滿足這個需求的,因為傳入的引數個數是不固定的。
其實這裡的需求是我們在柯里化的過程中既能返回乙個函式繼續接受剩下的引數,又能就此輸出當前的乙個結果。
這裡就需要使用函式的tostring來完成。
當我們返回函式的時候,會呼叫函式的tostring來完成隱式轉換,這樣輸出的就不是函式的字串形式而是我們定義的tostring返回的值。這樣就既可以保持返回乙個函式,又能夠得到乙個特定的值。
function
add()
fn.tostring = function
()) }
return fn ;
}
add(1)(2,3)//6
add(1)(2)(3)(4)(5)//15
這樣這個函式可以接受任意個數的引數,被呼叫任意次。
呼叫過程:
function
()
同時返回值為此函式的tostring結果1。
(function
())(2,3)
;
此時新引數newargs為[1,2,3],同時再次呼叫add,返回函式:
function
()
並且此函式的值為tostring的結果即6,因此可以輸出6。
其實就是每次都更新當前的引數,重新呼叫一下add函式,並計算當前為止的結果。
其實這個函式沒有什麼通用性,通常用於封裝特定的函式。還是前面兩版柯里化函式比較通用。
js反柯里化
反柯里化主要是借用別人的函式,比如類陣列沒有push函式,但是可以借用push函式,push 呼叫的時候,push裡面的this值是,但是arguments.push 是不行的,因為arguments沒有這個方法,那怎麼辦呢,反柯里化就是要修改裡面的this值,所謂的this泛化,讓this程式設計...
js函式柯里化
什麼是函式柯里化?在電腦科學中,柯里化 currying 是把接受多個引數的函式變換成接受乙個單一引數 最初函式的第乙個引數 的函式,並且返回接受餘下的引數且返回結果的新函式的技術。這個技術由 christopher strachey 以邏輯學家 haskell curry 命名的,儘管它是 mos...
js 函式柯里化
函式柯里化的主要目的就是為了減少函式傳參,同時將一些固定引數私有化。下面展示一段非常簡單計算圓面積的 來說明函式柯里化的原理 circle函式,接受半徑r和 function circle r,p 通過函式柯里化來簡化circle函式,只傳入半徑就能計算出面積 不管怎麼樣,是不會變的,因此我們將他寫...