Javascript 使用未知数量的参数调用回调
javascript中是否有方法调用具有未知数量参数的回调 例如,如果这是我们的调用方法:Javascript 使用未知数量的参数调用回调,javascript,Javascript,javascript中是否有方法调用具有未知数量参数的回调 例如,如果这是我们的调用方法: function invokeCallback(callback, params) { return callback.invoke(params); } 如果这些是我们的示例回调方法: function action() { doSomeAction(); } function greet(msg) { console.log(msg); } function nameag
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!如果我错了,请纠正我,但我问题的答案不包含在该问题中。请修改你的评论。祝你好运。有时,问题似乎与其他问题相符,但结果往往不同。在这种情况下,答案非常简单,为了社区的利益,我们应该为那些只需要简单答案的人提出这样的问题。如果我需要更多的信息,我一定会按照你的链接。再次感谢!