封装函数实例柯里化

64 阅读2分钟
  1. 函数柯里化
    概念:在计算机科学中,柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术。
  2. 偏函数
    所谓偏函数,就是以原函数为基础,将某个位置上的参数固定住(默认是从第一个参数固定),后续参数重新扩展传递给原函数,对外则是生成一个新函数。

思路:求n个数字的和,但是不知道由多少个数字,于是采用...rest接收任意多个参数,然后利用柯里化函数帮我统计参数,顺便调用功能函数。

function sum(...rest) { //功能函数,求和
    return rest.reduce((prev, next) => prev + next);
}
function sortNum(...rest) { //功能函数,排序数字
    return rest.sort((a, b) => a - b);
}
function currying(fn) { //fn:是功能函数(利用参数实现什么功能)
    let arg = []; //利用此数组来统计所有的参数
    return function result(...rest) { //添加result名字,因为函数内部递归调用。   ...rest运算符(函数参数),将参数合并为数组
        // rest统计参数,如果rest长度为0,说明没有参数,结束了,调用功能函数
        if (rest.length === 0) { //参数为0,拼接完成,执行函数,传递参数
            return fn(...arg); //调用函数,返回函数体,传递参数
        } else { //继续递归拼接函数参数
            arg.push(...rest); //...扩展运算符。获取的数组转换成单个的值
            return result; //返回函数,继续拼接剩下的参数,直到参数个数为0,执行if语句
        }
    }
}
console.log(currying(sum)(1, 2, 3, 4)());
console.log(currying(sum)(1)(2, 3)(4)(5)(6)()); //21
console.log(currying(sum)(1, 2, 3)(4, 5)(6, 7)()); //28
console.log(currying(sum)(1)(2)(3)(4)(5)(6)(7)(8)(9)(10)()); //55
console.log(currying(sortNum)(1, 34, 5, 67, 23, -10)());
console.log(currying(sortNum)(1, 34, 5)(67, 23, -10)());
console.log(currying(sortNum)(45)(5)(7)(22)(1)(3)(2)());