JavaScript柯里化

一泛鸟、簡介

維基百科中的定義:柯里化(Currying)奄容,又稱部分求值,是把接受多個參數(shù)的函數(shù)變換成接受一個單一參數(shù)(最初函數(shù)的第一個參數(shù))的函數(shù)啡邑,并且返回接受余下的參數(shù)而且返回結(jié)果的新函數(shù)的技術(shù)贱勃。這個技術(shù)以邏輯學(xué)家哈斯凱爾·加里命名的。

柯里化是函數(shù)式語言都有的一個特性,如Perl募寨,Python族展,JavaScript。這里介紹JavaScript中柯里化的思想及應(yīng)用拔鹰。

二、柯里化代碼分析

// 簡單的柯里化例子
// 原函數(shù)
function add(a, b, c) {
    return a + b + c;
}
// 將原函數(shù)柯里化
function _add(a) {
    return function(b) {
        return function(c) {
            return a + b + c;
        }
    }
}

// 將add函數(shù)柯里化后贵涵,以下2種調(diào)用方式是等價的
add(1, 2, 3);
_add(1)(2)(3);

我們靠眼力自己封裝的柯里化函數(shù)自由度偏低列肢,
下面來看一個比較通用的柯里化例子(函數(shù)為固定參數(shù)個數(shù)的柯里化)

// 通用的柯里化例子
// 原函數(shù)
function add(a, b, c) {// 函數(shù)可處理的參數(shù)個數(shù)為3
    return a + b + c;
}
// 通用的柯里化函數(shù)
function createCurry(func, args) {
    // 獲取被柯里化的函數(shù)的參數(shù)個數(shù),即func實(shí)際可以處理的參數(shù)個數(shù)宾茂,這里是3
    var arity = func.length;
    // 用來存儲柯里化時需要被復(fù)用的參數(shù)
    var args = args || [];

    return function() {
        // [].slice.call(arguments)等價于arguments.slice
        // [].slice.call(arguments)的作用是將argments這個類數(shù)組對象轉(zhuǎn)為數(shù)組
        var _args = [].slice.call(arguments);

        // [].push.apply(_args, args)等價于_args.push(args)
        [].push.apply(_args, args);

        // 如果參數(shù)個數(shù)小于最初的func.length瓷马,則遞歸調(diào)用,繼續(xù)收集參數(shù)
        if (_args.length < arity) {
            return createCurry.call(this, func, _args);
        }

        // 參數(shù)收集完畢跨晴,則執(zhí)行func
        return func.apply(this, _args);
    }
}
// 將原函數(shù)柯里化
var _add = createCurry(add)

// 將add函數(shù)柯里化后欧聘,以下4種調(diào)用方式是等價的
1、add(1,2,3)
2端盆、_add(1,2,3)
3怀骤、_add(1)(2)(3)
4、_add(1,2)(3)

在lodash.js中的也有_.curry()函數(shù)焕妙。

三蒋伦、柯里化使用場景

  1. 參數(shù)復(fù)用。固定不變的參數(shù)焚鹊,實(shí)現(xiàn)參數(shù)復(fù)用是 Currying 的主要用途之一痕届。上例中調(diào)用方式改為 _add=createCurry(add,10),則實(shí)現(xiàn)復(fù)用參數(shù)10,實(shí)現(xiàn)每次調(diào)用_add函數(shù)都加10的功能末患。
  2. 提高適用性研叫。可點(diǎn)擊查看本鏈接中的例子
  3. 延遲執(zhí)行/計算。延遲計算:一個currying的函數(shù)首先會接受一些參數(shù)璧针,接受了這些參數(shù)后嚷炉,該函數(shù)并不會立即求值,而是繼續(xù)返回另外一個函數(shù)陈莽,剛才傳入的參數(shù)在函數(shù)形成的閉包里被保存起來渤昌。待到函數(shù)真正需要求值的時候,之前傳入的參數(shù)都會被一次性用于求值走搁。 上面的例子可以比較好的說明了独柑,收集所有參數(shù),收集完才進(jìn)行最后的加法運(yùn)行私植。

四忌栅、注意

在柯里化的實(shí)現(xiàn)中,我們知道柯里化雖然具有了更多的自由度,但同時柯里化通用式里調(diào)用了arguments對象索绪,使用了遞歸與閉包湖员,因此柯里化的自由度是以犧牲了一定的性能為代價換來的。只有在情況變得復(fù)雜時瑞驱,才是柯里化大顯身手的時候娘摔。
如果我們只是想提前綁定參數(shù),那么我們有很多好幾個現(xiàn)成的選擇唤反,bind凳寺,箭頭函數(shù)等,而且性能比Curring更好彤侍。
Currying 生于函數(shù)式編程肠缨,也服務(wù)于函數(shù)式編程。假如沒有準(zhǔn)備好寫純正的函數(shù)式代碼盏阶,那么 Currying 有更好的替代品晒奕。

相關(guān)參考

柯里化
JS中的柯里化
前端開發(fā)者進(jìn)階之函數(shù)柯里化Currying
大佬,JavaScript 柯里化名斟,了解一下脑慧?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市蒸眠,隨后出現(xiàn)的幾起案子漾橙,更是在濱河造成了極大的恐慌,老刑警劉巖楞卡,帶你破解...
    沈念sama閱讀 216,843評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件霜运,死亡現(xiàn)場離奇詭異,居然都是意外死亡蒋腮,警方通過查閱死者的電腦和手機(jī)淘捡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,538評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來池摧,“玉大人焦除,你說我怎么就攤上這事∽魍” “怎么了膘魄?”我有些...
    開封第一講書人閱讀 163,187評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長竭讳。 經(jīng)常有香客問我创葡,道長,這世上最難降的妖魔是什么绢慢? 我笑而不...
    開封第一講書人閱讀 58,264評論 1 292
  • 正文 為了忘掉前任灿渴,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘骚露。我一直安慰自己蹬挤,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,289評論 6 390
  • 文/花漫 我一把揭開白布棘幸。 她就那樣靜靜地躺著焰扳,像睡著了一般。 火紅的嫁衣襯著肌膚如雪误续。 梳的紋絲不亂的頭發(fā)上蓝翰,一...
    開封第一講書人閱讀 51,231評論 1 299
  • 那天,我揣著相機(jī)與錄音女嘲,去河邊找鬼。 笑死诞帐,一個胖子當(dāng)著我的面吹牛欣尼,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播停蕉,決...
    沈念sama閱讀 40,116評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼愕鼓,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了慧起?” 一聲冷哼從身側(cè)響起菇晃,我...
    開封第一講書人閱讀 38,945評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蚓挤,沒想到半個月后磺送,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,367評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡灿意,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,581評論 2 333
  • 正文 我和宋清朗相戀三年估灿,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片缤剧。...
    茶點(diǎn)故事閱讀 39,754評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡馅袁,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出荒辕,到底是詐尸還是另有隱情汗销,我是刑警寧澤,帶...
    沈念sama閱讀 35,458評論 5 344
  • 正文 年R本政府宣布抵窒,位于F島的核電站弛针,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏估脆。R本人自食惡果不足惜钦奋,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,068評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧付材,春花似錦朦拖、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,692評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至富寿,卻和暖如春睬隶,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背页徐。 一陣腳步聲響...
    開封第一講書人閱讀 32,842評論 1 269
  • 我被黑心中介騙來泰國打工苏潜, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人变勇。 一個月前我還...
    沈念sama閱讀 47,797評論 2 369
  • 正文 我出身青樓恤左,卻偏偏與公主長得像,于是被迫代替她去往敵國和親搀绣。 傳聞我的和親對象是個殘疾皇子飞袋,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,654評論 2 354