作用
函數(shù)柯里化,用于創(chuàng)建一個函數(shù)梗摇,這個函數(shù)是已經(jīng)設置好了一個或者多個參數(shù)引用紅寶書
其實就是說當一個函數(shù) 鹊漠,有多個參數(shù)的時候,先傳遞一部分函數(shù)參數(shù)然后調(diào)用它浙滤,然后返回一個新的函數(shù)阴挣,這個函數(shù)接受剩余參數(shù),然后返回計算結(jié)果纺腊;
價值
提高參數(shù)復用性畔咧,優(yōu)化代碼,看下面demo
假設有這樣一個需求揖膜,需要計算x*y的返回值
// 非柯里化計算2*y
const fn = (baseNum, currentNum) => baseNum * currentNum;
// 2 *3
fn(2,3)
// 2*4
fn(2,3)
....
// 柯里化計算2*y
const fn = baseNum => currentNum => baseNum * currentNum;
const fn2 = baseNum(2)
//2*3
fn2(3)
//2*4
fn2(4)
....
看上面demo誓沸,2這個參數(shù)在非柯里化的時候重復出現(xiàn),但是其實壹粟,這個參數(shù)完成是可以通過技術手法復用的就是柯里化拜隧,在柯里化之后,2這個參數(shù)就省略了
當然趁仙,現(xiàn)在有很多庫都實現(xiàn)了柯里化函數(shù)比如 lodash中curry方法
為了跟好的理解洪添,接下里啊模擬個curry方法
function curry (func) {
// 首先return一個函數(shù)
return function curriedFcuntion(...args) {
//通過解構,接受參數(shù)不確定的case
// 判斷形參和實參的個數(shù)
//形參指的是傳入的函數(shù)參數(shù)的個數(shù)幸撕,這里指的就是getSum這個函數(shù)的形參
// 獲取函數(shù)形參薇组,通過函數(shù)名.length方法獲得
if (args.length < func.length) {
return function () {
return curriedFcuntion(...args.concat(Array.from(arguments)))
}
}
// 也可以使用 func.apply(this,[...args])
return func(...args )
}
}
//測試下
function addSum (a, b, c) {
return a + b + c
}
const curried = curry(addSum)
console.log(curried(1, 2, 3))
console.log(curried(1)(2, 3))
console.log(curried(1, 2)(3))
//6
//6
//6
總結(jié)
1、柯里化是對函數(shù)參數(shù)的一種緩存
2坐儿、使函數(shù)的顆粒度細膩
3律胀、可以使多元函數(shù)轉(zhuǎn)換成一元函數(shù)宋光,進而組合使用生產(chǎn)更強大的函數(shù)