柯里化add(1)(2)(3)

192 阅读1分钟

在数学和计算机科学中,柯里化是一种将使用多个参数的一个函数转换成一系列使用一个参数的函数的技术。

举个例子:

function add(a, b) {
    return a + b;
}

// 执行 add 函数,一次传入两个参数即可
add(1, 2) // 3

// 假设有一个 curry 函数可以做到柯里化
var addCurry = curry(add);
addCurry(1)(2) // 3

参数复用。本质上是降低通用性,提高适用性。

柯里化实现add

第一种实现 add(1,2)().toString();

    function add() {
        // 第一次执行时,定义一个数组专门用来存储所有的参数
        var _args = Array.prototype.slice.call(arguments);

        // 在内部声明一个函数,利用闭包的特性保存_args并收集所有的参数值
        var _adder = function() {
            _args.push(...arguments);
            return _adder;
        };

        // 利用toString隐式转换的特性,当最后执行时隐式转换,并计算最终的值返回
        _adder.toString = function () {
            return _args.reduce(function (a, b) {
                return a + b;
            });
        }
        return _adder;
    }
    
    
  
    function add(){
      let arr = Array.prototype.slice.call(arguments)//先把第一个参数转换成数组
      fn = function(){
        let arr2 = Array.prototype.slice.call(arguments)//把第二个参数变成数组
        return add.apply(null,arr.concat(arr2))//把两个数组合拼成一个,然后当成参数传入,重新执行add
      }
      fn.toString = function(){
        return arr.reduce((value,n)=> {  //参数逐个相加
          return value + n
        })
      }
      return fn
    }

第二种实现 add(1)(2)(3).equals();

var add = function(){
    var args = [...arguments];
    var adder = function(){
        var args2 = [...arguments];
        return add.apply(null,args.concat(args2));
    }
    adder.equals = function(){
        let res = args.reduce((a,b)=>{
            return a+b;
        });
        return res;
    }
    return adder;
}