Javascript 使用未知数量的参数调用回调

Javascript 使用未知数量的参数调用回调,javascript,Javascript,javascript中是否有方法调用具有未知数量参数的回调 例如,如果这是我们的调用方法: function invokeCallback(callback, params) { return callback.invoke(params); } 如果这些是我们的示例回调方法: function action() { doSomeAction(); } function greet(msg) { console.log(msg); } function nameag

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);
那就太好了


这样做可能吗?

callback.apply或callback.call

您的回调将如下所示:

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

是的,这是可能的。关键函数是,它在提供上下文和参数的同时调用函数。参数以数组形式给出。(以这种方式,它不同于明确给出参数的情况。)

让我们看看你的函数签名:

function invokeCallback(callback, params) {
我们可以非常简单地做到这一点:

function invokeCallback(callback, params) {
    return callback.apply(null, params);
}
(第一个参数是函数的上下文,即函数中的值。因为我们不想指定任何特定内容,所以使用
null

但是,调用函数的方式略有不同:

invokeCallback(nameage, 'Bob', 20);
你看到区别了吗?这里,参数是显式给出的,而不是作为数组。因此,我们需要稍微不同地处理它。在函数中,对象包含提供给函数的参数。在上述情况下,它将包含三个:
nameage
'Bob'
,和
20
。我们想用参数
'Bob'
20
调用
nameage

arguments
对象看起来像一个数组,但它不是数组。因此,我们必须使用稍微复杂的函数调用来获取值:

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

正如其他答案中已经提到的,和是您想要查看的两种方法。它们的操作方式略有不同-apply将参数作为单个数组,而call将参数作为单个参数

您可能希望探索此技术在何处使用的一个相关概念是

关于您的示例,您应该考虑从函数定义中删除
params
参数,并删除作为回调函数本身的开始参数:

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

完美地回答了这个问题,简洁地回答了明显重复的问题。谢谢@lonesomeday!如果我错了,请纠正我,但我问题的答案不包含在该问题中。请修改你的评论。祝你好运。有时,问题似乎与其他问题相符,但结果往往不同。在这种情况下,答案非常简单,为了社区的利益,我们应该为那些只需要简单答案的人提出这样的问题。如果我需要更多的信息,我一定会按照你的链接。再次感谢!