2013-11-14 33 views
4

有没有在javascript中调用具有未知数量参数的回调的方法?调用具有未知数量参数的回调

例如,如果这是我们调用的方法:

function invokeCallback(callback, params) { 
    return callback.invoke(params); 
} 

如果这些都是我们的例子中的回调方法:

function action() { 
    doSomeAction(); 
} 

function greet(msg) { 
    console.log(msg); 
} 

function nameage(name, age) { 
    var msg = 'My name is ' + name + ' and my age is ' + age; 
    console.log(msg); 
} 

而如果我们可以那么轻松地调用它们像这样:

invokeCallback(action); 
invokeCallback(greet, 'Hello!'); 
invokeCallback(nameage, 'Bob', 20); 

然后它会很好。

是这样的可能吗?然后

+0

纠正我,如果我错了,但答案我的问题没有包含在这个问题中。请修改您的评论。 –

+0

良好的通话。有时问题可能会与其他问题相匹配,但结果往往不同。在这种情况下,答案很简单,为了社区的缘故,我们应该为那些只需要简单答案的人提出这样的问题。如果我需要更多信息,我一定会按照你的链接。再次感谢! –

回答

5

正如在其他的答案已经提到,Function.prototype.applyFunction.prototype.call是你想看的两种方法。它们在操作方式上略有不同 - 应用程序将参数作为单个数组,而调用将它们作为单独的参数。

您可能希望探索使用此技术的相关概念是currying

关于你的榜样,你应该看看从你的函数定义中删除params参数,并消除了开幕参数,它是回调函数本身:

function invokeCallback(callback) { 
    var params = Array.prototype.slice.call(arguments, 1); 
    return callback.apply(this, params); 
} 
3

是的,这是可能的。关键功能是Function#apply,它在提供上下文和参数时调用函数。参数以数组形式给出。 (通过这种方式,它不同于Function#call,其中的参数明确给出。)

因此,让我们看看你的函数签名:

function invokeCallback(callback, params) { 

我们可以做到这一点很简单:

function invokeCallback(callback, params) { 
    return callback.apply(null, params); 
} 

(第一个参数是该函数的上下文,即其中的值为this因为我们不想指定任何特定的东西,所以我们使用null。)

但是,你打电话给你的运作方式略有不同:

invokeCallback(nameage, 'Bob', 20); 

你看到区别?这里,参数是明确给出的,而不是数组。因此,我们需要稍微改变一下。在一个函数中,arguments对象包含提供给该函数的参数。在上述情况下,它将包含三个:nameage,'Bob'20。我们想用参数'Bob'20拨打nameage。对象看起来像一个数组,但它不是一个。因此,我们必须使用稍微复杂的呼叫到Array#slice函数来获取值了:

var params = Array.prototype.slice.call(arguments, 1); // get all arguments after the first one 

因此,我们的功能是这样的:

function invokeCallback(callback) { 
    var params = Array.prototype.slice.call(arguments, 1); // get all arguments after the first one 

    return callback.apply(null, params); 
} 
+0

完美地回答了这个问题,并且简洁地表达了与显而易见的重复问题上的答案不同的问题。谢谢@lonesomeday! –