-6

任务:写一个函数foo。

function arg1(a,b) {
    return a + b;
}
var x = foo(arg1, arg2);
x(arg3); // return arg2 + arg3
var y = foo(arg1, arg2, arg3);
y(); // return arg2 + arg3 

我无法理解如何首先var x, y- 数字(因为 arg1() 返回数字),然后x, y- 函数。这怎么可能?

4

1 回答 1

2

你想要的是高阶函数curry,一个将返回另一个函数的函数

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

function curry(fun) {
   var args = [].slice.call(arguments);
   args.shift();
   return function() {
       return fun.apply(null, args.concat([].slice(arguments)));
   };
}

x = curry(add, 10, 20);
x();

如果要添加两个以上的参数,则需要重写 add 函数,您可以迭代或使用另一个高阶函数 reduce。

function add() {
   [].slice.call(null, arguments).reduce(function(a, b) { return a+b; });
}

或者你可以使用@PaulS。在您的 foo 函数中使用 reduce 将其调用为多个参数的解决方案:

function foo(fun) {
   var args = [].slice.call(arguments);
   args.shift();
   return function() {
      return args.concat([].slice.call(arguments)).reduce(fun);
   };
};

var x = foo(add, 10, 20, 30);
x(30);
于 2013-08-22T20:22:04.997 回答