2013-08-22 77 views
-5

任务:写一个函数foo。函数中的函数Javascript

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 - 功能。这怎么可能?

+3

你想做什么?什么是'foo'? 'arg1' *是一个变量,它也是一个函数。什么是'arg2'和'arg3'?你能再解释一下吗?什么有效,不起作用?您想做什么?这是做什么的? –

+0

@RocketHazmat他希望'x'是一个函数,他没有'foo',所以他想要一个更高阶的函数。 – jcubic

+0

试图更详细地解释。 – user54264

回答

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(); 

的功能,你可以遍历或使用其他更高顺序功能降低。

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

或者您可以使用@PaulS。解决方案使用减少你的foo函数来调用它多于一个参数:

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); 
+0

我写了一段代码,你现在看起来有点类似(除了我用'reduce'),但是我不能发布,因为问题已经关闭了 - 但是,我相信这就是他们想要的, +1 –

+0

@PaulS。在阅读您的评论之前,只需使用reduce添加'add'功能。 – jcubic

+0

我的放置位置是'generatorArgs.concat(args).reduce(func);' –