什么是函數(shù)柯里化(Currying)
維基百科:
在計(jì)算機(jī)科學(xué)中,柯里化(英語:Currying)赏壹,又譯為卡瑞化或加里化旁仿,是把接受多個(gè)參數(shù)的函數(shù)變換成接受一個(gè)單一參數(shù)(最初函數(shù)的第一個(gè)參數(shù))的函數(shù)倍谜,并且返回接受余下的參數(shù)而且返回結(jié)果的新函數(shù)的技術(shù)瓢省。
簡單理解就是把一個(gè)有n個(gè)參數(shù)的函數(shù)轉(zhuǎn)換成n個(gè)嵌套的函數(shù)窟坐,每個(gè)函數(shù)只接受一個(gè)參數(shù)海渊,并返回一個(gè)新函數(shù)。也就是把fn(a,b,c)
轉(zhuǎn)化為fn(a)(b)(c)
哲鸳。
例子
例如一個(gè)函數(shù)接受a, b, c三個(gè)參數(shù)臣疑,返回它們的和:
function sum(a, b, c) {
return a + b + c
}
運(yùn)行此函數(shù),我們?cè)趨?shù)中依次傳入1徙菠,2讯沈,3,返回6婿奔。
sum(1, 2, 3) // 6
函數(shù)柯里化之后:
function fn(a) {
return (b) => {
return (c) => {
return a + b + c
}
}
}
fn(1)(2)(3) // 6
我們把sum(1, 2, 3)
變成了fn(1)(2)(3)
的形式缺狠。通過把一個(gè)多參函數(shù)轉(zhuǎn)換成一系列嵌套的函數(shù)问慎,每個(gè)函數(shù)依次接受一個(gè)參數(shù),這就是函數(shù)柯里化。這里用到了高階函數(shù)和閉包相關(guān)的知識(shí),函數(shù)柯里化其實(shí)是高階函數(shù)的應(yīng)用惊暴。
什么是偏函數(shù)(Partial function)
它是指使用一個(gè)函數(shù)并將其應(yīng)用一個(gè)或多個(gè)參數(shù),但不是全部參數(shù)笼恰,在這個(gè)過程中創(chuàng)建一個(gè)新函數(shù),這個(gè)函數(shù)用于接受剩余的參數(shù)歇终。偏函數(shù)解決這樣的問題:如果我們有函數(shù)是多個(gè)參數(shù)的社证,我們希望能固定其中某幾個(gè)參數(shù)的值。
例子
/*
function sum(a, b, c) {
return a + b + c
}
*/
// 使用偏函數(shù)的寫法
function fn(a) {
return (b, c) => {
return a + b + c
}
}
//變量foo接受返回的新函數(shù)
var foo = fn(1)
//在調(diào)用的時(shí)候傳入剩余的參數(shù)
foo(2,3) // 6
總結(jié)
柯里化和偏函數(shù)都是用于將多個(gè)參數(shù)函數(shù)评凝,轉(zhuǎn)化為接受更少參數(shù)函數(shù)的方法追葡,它們都能夠固定參數(shù)。但是其中不同之處在于:
- 柯里化是將函數(shù)轉(zhuǎn)化為多個(gè)嵌套的一元函數(shù)奕短,也就是每個(gè)函數(shù)只接受一個(gè)參數(shù)宜肉。
- 偏函數(shù)可以接受不只一個(gè)參數(shù),它被固定了部分參數(shù)作為預(yù)設(shè)篡诽,并可以接受剩余的參數(shù)崖飘。