任务:写一个函数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
- 函数。怎么可能?
答案 0 :(得分: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);