函数柯里化(Currying)

函数柯里化是一种将接受多个参数的函数转化为接受单个参数并返回新函数的技术。文章通过简单场景(两数相加)、复杂场景(求1-5之和)和进阶场景(动态参数求和)来阐述Currying的概念,展示了如何使用闭包和数组处理不定数量的参数,最终实现累加功能。并提供了一种优化的解决方案,允许在不同步骤中传递参数,直到调用`.MyOver()`方法来计算总和。
摘要由CSDN通过智能技术生成

什么是函数柯里化(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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值