什么是函数柯里化(Currying)?
官方定义:把一个接收多个参数的函数,设计成一个:接收单一参数的函数,并返回一个能够接收剩余参数的新函数,最后返回结果。
1、简单场景:求两数之和
普通函数
function addNum(a,b) {
return a + b;
}
console.log("普通函数"+addNum(1,2)); //3
柯里化函数
function addNumCurry(a) {
return function (b) {
return a+b //能获取到a的值,是闭包的特性
}
}
console.log("柯里化函数", addNumCurry(1)(2));//3
addNumCurry(1)(2), 有没有感觉用法跟自执行函数类似?
(function ziZhiXing(a){
console.log("自执行函数",a) //自执行函数 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("柯里化函数", addNumCurry(1)(2)(3)(4)(5));//15
简化写法
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());//15
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 () {
//数组累加和 reduce
return numAll.reduce((x,y)=>{
return x+ y
})
}
return fn
}
console.log("柯里化函数",addNumCurry(1,2,3)(4,5)(6)(7,8)(9,10).MyOver());//15