函数柯里化(详解)

   首先了解函数柯里化的概念:在计算机科学中,柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术;

   初读不知句中意?那就用代码演示;

   首先就是要有接收多个参数的函数;

 function fn() {
            let arr = Array.prototype.slice.call(arguments);
            let result = arr.reduce((pre, a) => {
                return pre += a;
            }, 0)
            return result;
        }
        console.log(fn(1, 2, 3, 4, 5));

 上面就是一个接收多个参数的函数;

紧接着概念往下--变成接收一个单一参数的函数;

   也就是将fn(1,2,3,4,5)--变成fn(1) 函数这种每次只接受一个参数的形式;但是概念后面还有-最后一句话:这个单一参数的函数(fn(1))能返回接收余下参数(就是相比较fn(1,2,3,4,5)fn(1)还要把剩下的参数都以它(fn(x))这种形式接受);且返回结果的新函数的技术--这里的返回结果就是函数对这些参数要进行处理的结果(也就是我们定义这个函数的功能);

   在fn(1,2,3,4,5)函数中他的功能就是把参数进行相加,让后记性返回;

   函数柯里化就是把fn(1,2,3,4,5)这种形式变成 以fn(1)fn(2)fn(3)fn(4)fn(5)这种形式接受参数;来实现fn(1,2,3,4,5)函数的功能;

    进行代码演示:

       

 function curry() {
            let arr = Array.prototype.slice.call(arguments); //接受一个参数;
            return function result() { //返回一个函数--作用是用来接收第二个参数;
                arr.push(...arguments);
                return arr.reduce((pre, ele) => {
                    return pre += ele;
                }, 0)
            }
        }
        console.log(curry(1)(2));//3

我们用一个函数只接受一个参数;但是我们又返回一个函数,用来接收剩下的另外一个参数;我们定义数组arr的意义就是拼接接受来的参数;---上面的例子中我们只能接受连个参数,以为我们在接收第二个参数后返回的是一个运算的结果,如果想要继续接受参数,就返回result这个函数本身;

  代码展示:

    

 function curry() {
            let arr = Array.prototype.slice.call(arguments);
            return function result() {
                arr.push(...arguments);
                return result;
            }
        }
        console.log(curry(1)(2));

它的返回结果是什么?---当然是一个result函数了;

     写到这我们干了什么?------只是将参数拼接到了一个数组中了;

验证一下:

     

   function curry() {
            let arr = Array.prototype.slice.call(arguments);
            return function result() {
                arr.push(...arguments);
                console.log(arr);
                return result;
            }
        }
        console.log(curry(1)(2));
        console.log(curry(1)(2)(3)(4));

 从运行结果就能看出我们只是保留了所有输入的参数值;并且它函数执行返回的就是一个保存了所有参数的的函数;如果我们想要对返回的函数进行执行,肯定是在返回的函数后添加();所以我们可以在result函数中添加判断来确认函数的功能什么时候执行并返回执行的结果;

    我们判断的依据就是不传入参数;----代码演示

    

 function curry() {
            let arr = Array.prototype.slice.call(arguments);
            return function result() {
                if (arguments.length == 0) { //当不传参数就意味着要执行函数了;
                    let res = arr.reduce((pre, ele) => {
                        return pre += ele;
                    }, 0);
                    return res;
                } else {
                    arr.push(...arguments);
                    return result;
                }

            }
        }
        console.log(curry(1)(2)());//3
        console.log(curry(1)(2)(3)(4)());//10

这样就能实现函数的柯里化了;

  

    

   

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值