引子
先來看一道小問題:
有人在群里出了到一道題目:
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函數。我會實現這樣的函數,但是現在,我們首先看看為什么這樣的函數是如此必要。
舉個例子,手動柯里化一個函數并不困難,但是確實有點
主站蜘蛛池模板:
木里|
当阳市|
彩票|
临清市|
依兰县|
罗江县|
荆州市|
广平县|
芦溪县|
阳东县|
临高县|
班戈县|
米脂县|
莱州市|
南安市|
额尔古纳市|
苏尼特左旗|
松滋市|
江达县|
满洲里市|
藁城市|
雅江县|
利川市|
山阴县|
临泉县|
南投市|
苏尼特右旗|
岳西县|
天峻县|
克拉玛依市|
遂川县|
运城市|
灵山县|
汝城县|
乌鲁木齐市|
徐闻县|
延川县|
唐山市|
永城市|
开平市|
原阳县|