什么是函数柯里化(Currying)?
官方定义:把一个接收多个参数的函数,设计成一个:接收单一参数的函数,并返回一个能够接收剩余参数的新函数,最后返回结果。
1、简单场景:求两数之和
普通函数
function addNum(a,b) {
return a + b;
}
console.log("普通函数"+addNum(1,2));
柯里化函数
function addNumCurry(a) {
return function (b) {
return a+b
}
}
console.log("柯里化函数", addNumCurry(1)(2));
addNumCurry(1)(2), 有没有感觉用法跟自执行函数类似?
(function ziZhiXing(a){
console.log("自执行函数",a)
})("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("柯里化函数", addNumCurry(1)(2)(3)(4)(5));
简化写法
function addNumCurry(a) {
let numAll = a || 0;
let fn = function (b) {
numAll = numAll + b
return fn
}
fn.MyOver = function () {
return numAll
}
return fn
}
console.log("柯里化函数",addNumCurry(1)(2)(3)(4)(5).MyOver());
3、进阶场景:求 1-10 之和,每个里面参数不确定。例如 addNumCurry(1,2,3)(4,5)(6)(7,8)(9,10)
function addNumCurry(a) {
let numAll = [];
let _args = Array.prototype.slice.call(arguments);
numAll = [..._args]
let fn = function (b) {
let _brgs = Array.prototype.slice.call(arguments);
numAll = [...numAll,..._brgs]
return fn
}
fn.MyOver = function () {
return numAll.reduce((x,y)=>{
return x+ y
})
}
return fn
}
console.log("柯里化函数",addNumCurry(1,2,3)(4,5)(6)(7,8)(9,10).MyOver());