任务:写一个函数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
- 函数。这怎么可能?
任务:写一个函数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
- 函数。这怎么可能?
你想要的是高阶函数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);