什么是函数柯里化?它的本质和特点是什么?有哪些使用场景?

1.定义

把原来接收多个参数的函数改造成接收单个参数,并返回一个接收余下参数且返回结果的新函数,这样的"改造",叫做函数柯里化

//原函数:接收两个参数
function sum(a,b){console.log(a+b)}
sum(1,2)//3
//柯里化:
function sum(a){
  return function(b){
    console.log(a+b);
  }
}
sum(1)(2); // 3
2.本质和特点

可以看到把一个函数进行柯里化,其本质是闭包,
利用闭包来保存已传入的参数,当参数数量达到要求时执行原函数
柯里化的函数有如下特点:

  • 参数复用:固定部分参数,生成更小元的函数
  • 延迟执行:分批次传入参数,最后一步执行计算
  • 函数组合:便于创建可复用的函数片段
  • 单一职责:每个函数只处理一个参数
3.两个以上参数的函数柯里化如何处理?

要求:把function sum(a,b,c){}柯里化,然后可以这样调用sum(1)(2)(3)

function sum(a){
    return function(b){
        return function(c){
            console.log(a+b+c)
        }
    }
}

要求:五个形参的sum函数柯里化,然后可以这样调用sum(1)(2,3,4)(5),即形参个数不固定
步骤:

  • 1.保存不定长参数
  • 2.判断参数的个数
    • 2.1.长度到5:累加
    • 2.2.长度没到5:返回函数,接收剩余参数
//思路:保存不定长的参数,若未达到长度要求,则返回函数去接收剩余参数,若达到要求则累加5个参数
const nums = []

function sum(...args) {
    nums.push(...args)
    //2.判断参数的个数
    if (nums.length >= 5) {
        //2.1.长度到5:累加
        const res = nums.slice(0, 5).reduce((p, v) => p + v, 0)
        nums.length = 0 // 清空数组
        return res
    } else {
        //2.2.长度没到5:返回函数,接收剩余参数
        return sum
    }
}

// 测试代码
console.log("第一次调用:")
console.log(sum(1, 2)(3)(4, 5)) // 应该返回15
console.log("第二次调用:")
console.log(sum(1)(2)(3)(4)(5)) // 应该返回15
console.log("第三次调用:")
console.log(sum(1, 2, 3, 4, 5)) // 应该返回15

4.函数参数的个数为自定义,如何实现柯里化?

要求:

function sumMaker(){
    //
}
//调用:
const sum4=sumMaker(4)
sum4(1,2)(3)(4)
const sum6=sumMaker(6)
sum6(1,2)(3)(4,5,6)

思路:复用上节逻辑,形参为传入形参的个数
代码:

function sumMaker(length) {
	//1.保存不定长参数
    let nums = []
    
    function sum(...args) {
   		// 2.判断参数的个数
        nums.push(...args)
        // 2.1.长度到5:累加
        if (nums.length >= length) {
            const res = nums.slice(0, length).reduce((p, v) => p + v, 0)
            nums = [] // 重置数组
            return res
        } else {
        // 2.2.长度没到5:返回函数,接收剩余参数
            return sum // 返回函数继续接收参数
        }
    }
    
    return sum
}

// 测试代码
const sum5 = sumMaker(5)

console.log("测试1: sum5(1, 2)(3)(4, 5)")
console.log(sum5(1, 2)(3)(4, 5)) // 应该返回15

console.log("测试2: sum5(1)(2)(3)(4)(5)")  
console.log(sum5(1)(2)(3)(4)(5)) // 应该返回15

console.log("测试3: sum5(1, 2, 3, 4, 5)")
console.log(sum5(1, 2, 3, 4, 5)) // 应该返回15

// 测试不同的长度
const sum3 = sumMaker(3)
console.log("测试sum3(1)(2)(3):")
console.log(sum3(1)(2)(3)) // 应该返回6
5.函数柯里化的使用场景

使用场景:为函数预制通用函数,以供多次重复调用
示例:

//初始写法:
function typeOfText(type){
    function isundefined(obj){
        //return typeof obj==='undefined'
        return typeof obj===type
    }
    return isundefined
}
//优化写法:
function typeOfText(type){
    return function (obj){
        return typeof obj===type
    }
}
//改成箭头函数:
const typeOfTest=type=>obj=> typeof obj===type
//验证:
console.log(typeOfTest("string"))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前端OnTheRun

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值