什么是函数柯里化(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