什么是函數(shù)柯里化(Currying)让虐?
官方定義:把一個接收多個參數(shù)的函數(shù)谍夭,設計成一個:接收單一參數(shù)的函數(shù)黑滴,并返回一個能夠接收剩余參數(shù)的新函數(shù),最后返回結果紧索。
1袁辈、簡單場景:求兩數(shù)之和
普通函數(shù)
function addNum(a,b) {
return a + b;
}
console.log("普通函數(shù)"+addNum(1,2)); //3
柯里化函數(shù)
function addNumCurry(a) {
return function (b) {
return a+b //能獲取到a的值,是閉包的特性
}
}
console.log("柯里化函數(shù)", addNumCurry(1)(2));//3
addNumCurry(1)(2), 有沒有感覺用法跟自執(zhí)行函數(shù)類似珠漂?
(function ziZhiXing(a){
console.log("自執(zhí)行函數(shù)",a) //自執(zhí)行函數(shù) 10
})("10");
2晚缩、復雜場景:求 1-5 之和
function addNumCurry(a) {
return function (b) {
return function (c) {
return function (d) {
return function (e) {
return a+b+c+d+e
}
}
}
}
}
console.log("柯里化函數(shù)", addNumCurry(1)(2)(3)(4)(5));//15
簡化寫法
function addNumCurry(a) {
let numAll = a || 0; //存放數(shù)字和
let fn = function (b) {
numAll = numAll + b
return fn
}
//累加到最后一個后尾膊,自定義個結束屬性,也可以用原來就有的屬性
fn.MyOver = function () {
return numAll
}
return fn
}
console.log("柯里化函數(shù)",addNumCurry(1)(2)(3)(4)(5).MyOver());//15
3、進階場景:求 1-10 之和荞彼,每個里面參數(shù)不確定冈敛。例如 addNumCurry(1,2,3)(4,5)(6)(7,8)(9,10)
function addNumCurry(a) {
let numAll = []; //存放數(shù)字和
let _args = Array.prototype.slice.call(arguments); //存放第一次進去的參數(shù)
numAll = [..._args]
let fn = function (b) {
let _brgs = Array.prototype.slice.call(arguments);
numAll = [...numAll,..._brgs]
return fn
}
//累加到最后一個后,自定義個結束屬性,也可以用原來就有的屬性
fn.MyOver = function () {
//數(shù)組累加和 reduce
return numAll.reduce((x,y)=>{
return x+ y
})
}
return fn
}
console.log("柯里化函數(shù)",addNumCurry(1,2,3)(4,5)(6)(7,8)(9,10).MyOver());//15