引子
先來看一道小問題:
有人在群里出了到一道題目:
var s = sum(1)(2)(3) ....... 最后 alert(s) 出來是6
var s = sum(1)(2)(3)(4) ....... 最后 alert(s) 出來是10
問sum怎么實現?
剛看到題目,我第一反應是sum返回的是一個function,但是沒有最終實現,印象中看到過類似的原理,但是記不清了。
后來同事說,這個是叫柯里化,
實現方法比較巧妙:
function sum(x){ var y = function(x){ return sum(x+y) } y.toString = y.valueOf = function(){ return x; } return y; } 下面我們就深入來看一下currying柯里化~
什么是柯里化?
柯里化是這樣的一個轉換過程,把接受多個參數的函數變換成接受一個單一參數(注:最初函數的第一個參數)的函數,如果其他的參數是必要的,返回接受余下的參數且返回結果的新函數。
當我們這么說的時候,我想柯里化聽起來相當簡單。JavaScript中是怎么實現的呢?
假設我們要寫一個函數,接受3個參數。
var sendMsg = function (from, to, msg) { alert(["Hello " + to + ",", msg, "Sincerely,", "- " + from].join("/n"));};現在,假定我們有柯里化函數,能夠把傳統的JavaScript函數轉換成柯里化后的函數:
var sendMsgCurried = curry(sendMsg); // returns function(a,b,c) var sendMsgFromJohnToBob = sendMsgCurried("John")("Bob"); // returns function(c) sendMsgFromJohnToBob("Come join the curry party!"); //=> "Hello Bob, Come join the curry party! Sincerely, - John"手動柯里化
在上面的例子中,我們假定擁有神秘的curry函數。我會實現這樣的函數,但是現在,我們首先看看為什么這樣的函數是如此必要。
舉個例子,手動柯里化一個函數并不困難,但是確實有點
主站蜘蛛池模板:
周至县|
文山县|
永川市|
竹北市|
改则县|
晋宁县|
连平县|
定襄县|
通海县|
辽源市|
广平县|
南乐县|
鄂尔多斯市|
桂阳县|
南开区|
长丰县|
阳朔县|
平安县|
甘德县|
鸡泽县|
保山市|
始兴县|
兴宁市|
渑池县|
义马市|
教育|
潮安县|
普兰店市|
青河县|
咸阳市|
宁蒗|
吉安市|
三原县|
枣强县|
方正县|
溧阳市|
牙克石市|
晋中市|
三门峡市|
慈利县|
忻城县|