写一个sum函数使得以下表达式的值正确

sum(1,2,3).sumOf();//6
sum(2,3)(2).sumOf();//7
sum(1,2,3,4).sumOf();//10
sum(2)(4,1)(2).sumOf();//9

此题考查的是函数柯里化

函数柯里化(currying):把接收多个参数的函数变为只接收一个参数的函数,并且返回接受余下参数而且返回结果的新的函数

function sum(){
  var args = [].slice.call(arguments);
  var fn = function(){
    var args_fn = [].slice.call(arguments)
     return sum.apply(null, args.concat(args_fn));
  }
fn.sumOf = function(){
//reduce() 方法接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值。
//reduce() 可以作为一个高阶函数,用于函数的 compose。
//注意: reduce() 对于空数组是不会执行回调函数的
  var sum = args.reduce((a,b)=>a +b);
  return sum;
}
reutn fn;
}
sum(1,2,3).sumOf();
sum(2,3)(2).sumOf();
sum(1,2,3,4).sumOf();
sum(2)(4,1)(2).sumOf();

你可能感兴趣的:(写一个sum函数使得以下表达式的值正确)