函数柯里化

维基百科: 柯里化(英语:Currying),又译为卡瑞化或加里化,是把承受多个参数的函数变换成承受一个繁多参数(最后函数的第一个参数)的函数,并且返回承受余下的参数而且返回后果的新函数的技术。(这里说的是 返回一个承受繁多参数的函数,我感觉咱们实现的时候,能够更灵便,返回一个能够承受任意多参数的函数)

柯里化有什么用处

curry 的概念很简略:只传递给函数一部分参数来调用它,让它返回一个函数去解决剩下的参数。

// 原函数 var add = function(x,y) {    return x + y;};// 简略curry化后 应该是:var add = function(x) {    return function(y) {          return x + y;    };};// 实现离开传参的目标// 先加10var addTen = add(10);// 再加5addTen(5);   // 15addTen(10);  // 20

益处: 能够固定雷同参数,实现函数调用传参的简单化。

举个例子,计算一个长方体的体积,如果长方体长和宽是不变,高度是发生变化的。
个别状况下咱们会这么做:

    function volumn(l,w,h) {            return l*w*h    }    // 计算过程会变成这样    let V1 = volumn(10,20,30)    let V2 = volumn(10,20,20)    let V3 = volumn(10,20,15)        如果咱们把volumn函数柯里化,变成如下函数:    function curry_volumn(l,w) {            return function(h) {                    return l*w*h            }    }    // 计算过程能够优化如下    // 先传入长和宽,失去一个新函数    let square = curry_volumn(x,y)    // 再计算体积    let V1 = square(30)    let V2 = square(20)    let V3 = square(15)

例子简略,大家本人领会其中的益处。上面咱们就是要实现一个curry工具。

curry工具函数的简略实现

须要留神传入工具函数的函数参数是不肯定的。

 // 思路: // 1. curry工具函数 承受一个函数返回一个函数,框架如下: // function curry(fn) { //     return function(...args) {} // } // 2. 返回的函数能够承受一个参数或者多个参数, //    a.如果args长度大于等于 fn.length(形参),间接返回fn函数的执行后果 //    b.如果args长度小于 fn.length(形参),持续返回一个函数,返回的函数须要继续执行第二步的递归调用,别且记录前几次输出的参数,晓得参数长度大于等于fn.length,返回fn执行后果    // function curry(fn) {    //     return function(...args) {    //         if(args.length >= fn.length) {    //             如果传入参数长度等于原函数形参长度,间接返回后果    //         } else {    //             返回一个函数,函数外部须要从新比拟args.length >= fn.length,于是我封装了递归函数 rec    //         }    //     }    // }        // 柯里化工具函数    function curry(fn) {        // 获取形参的长度        return function(...args) {            if(args.length >= fn.length) {                // 如果传入参数长度等于原函数形参长度,间接返回后果                return fn.apply(this, args)            } else {                // 否则返回一个函数                let length = args.length;                return rec;                function rec(...others) {                    if(others.length + length >= fn.length) {                        return fn.apply(this, args.concat(others))                    } else {                        args = args.concat(others)                        length = others.length + length                        return rec                    }                }            }        }    }    // 用下面的例子做测试        function volumn(l, w, h) {        return l * w * h    }    let curry_volumn = curry(volumn)    let square = curry_volumn(10, 20)    console.log(square(10))   // 2000    console.log(square(20))   // 4000    console.log(square(30))   // 6000        // 测试传入不同数量的参数        console.log(curry_volumn(10)(20)(30))  //   6000    console.log(curry_volumn(10)(20,30))       //  6000    console.log(curry_volumn(10,20)(30))       //  6000    console.log(curry_volumn(10)(20)(30))   //  6000

最初

以上内容为集体学习总结,如有不正确之处,欢送指出。