如何使用多个可能的参数列表传递回调函数

时间:2017-02-14 10:18:37

标签: javascript

这是两个回调函数:

function callback_a(){
  alert('a');
}

function callback_b(p){
  alert('b says'+ p)'
}

如果我想使用callback_a

function test(callback){
  if(condition){
    callback();
  }
}

test(callback_a);

但是函数test并不适用于callback_b,那么如何实现一个可以通过多个可能的参数列表传递一些回调函数的公共函数。

7 个答案:

答案 0 :(得分:4)

有三种选择:

  • 最简单的方法是使用spread运算符:

    list

    在这种情况下,函数import git repo = git.Repo('path/to/repo') tags = sorted(repo.tags, key=lambda t: t.commit.committed_datetime) latest_tag = tags[-1] 的{​​{1}}的调用将是这样的:

    function test(callback, ...callback_args) {
      callback(...callback_args);
    }
    
  • 第二种方法是使用test作为JavaScript中任何函数的范围:

    callback_b

    test(callback_b,"b") 对函数arguments的调用将是相同的:

    function test(callback) {
      callback.apply(null, arguments.slice(1));
    }
    
  • 另一种选择是使用部分应用的功能。在这种情况下,您应该像这样定义testcallback_b语法):

    test(callback_b,"b")
    

    或没有b_callback

    ES6

    并像这样调用它:

    let callback_b = (p) => () => void{
        alert('b says'+ p)'
    }
    

答案 1 :(得分:2)

  

那么如何实现一个可以通过多个可能的参数列表传递一些回调函数的公共函数。

基本上,你不是。接收回调的函数负责回调作为参数接收的内容。当您致电Array#forEach时,它会Array#forEach决定您的回调获得哪些参数。同样,String#replace定义了它将回调的内容。

你的工作就是说test将会做什么,它将把它称为回调。然后,使用test正确编写回调的人的工作。例如:您可以将test记录为调用没有参数的回调。如果调用者想要使用callback_b,则由他们来处理callback_b期望参数的事实。他们有几种方法可以做到这一点:

可以将它包装在另一个函数中:

test(function() {
    callback_b("appropriate value here");
});

...或使用Function#bind

test(callback_b.bind(null, "appropriate value here"));

...但它是他们的问题,而不是你的问题。

旁注:如果他们通过你callback_b并且你没有任何参数调用它,你就不会收到错误。 JavaScript允许您调用参数少于预期的函数或更多。函数如何处理由函数的作者决定。

答案 2 :(得分:2)

在调用函数时会创建一个名为test(); // no arguments passed, but it still gets created: // arguments.length = 0 // arguments >> [] test(a); // ONE argument passed: // arguments.length = 1 // arguments >> [a] test(a,b,c,d); // FOUR arguments passed: // arguments.length = 4 // arguments >> [a,b,c,d] 的特殊对象。它是一个类似于数组的对象,表示传递给函数的参数:

可以像这样使用:

apply

知道了这一点,可以使用function test(callback) { callback.apply(null, Array.prototype.slice.call(arguments, 1)); } // arguments passed into test are available in the function scope when // .slice is used here to only pass the portion of the arguments // array relevant to the callback (i.e. any arguments minus the // first argument which is the callback itself.) // // N.B. The arguments object isn't an array but an array like object so // .slice isn't available on it directly, hence .call was used here) 从父函数传入的其余参数调用回调,如下所示:

{{1}}

可能值得一读:

答案 3 :(得分:0)

您可以在调用回调时传递参数



function test(callback){
  if(condition){
    callback();
  }
  else if(other condition){
    callback("b");  
   }
}

test(callback_b);




您可以编写回调函数,如



function callback_a_b(){
  if(arguments.length){
    var arg = [].slice.call(arguments);
    alert('b says'+ arg[0])  
  }
  else{
   alert('a');  
  }
  
}




答案 4 :(得分:0)

你可以传递一个匿名函数作为回调函数,它本身会返回你想要的带参数的回调函数。

test(function() { return callback_b(' how are you'); });

看到这个工作片段首先使用callback_a,然后使用callback_b(带参数)作为回调:



function callback_a(){
  alert('a');
}

function callback_b(p){
  alert('b says'+ p);
}

function test(callback){
  if(true){
    callback();
  }
}

test(callback_a);
test(function() { return callback_b(' how are you'); });




答案 5 :(得分:0)

您可以将参数数组作为test函数的第二个参数传递,或者在ES6中使用传播运算符read more here

function test(callback, params){
  if(condition){
    if (params === undefined){
      callback();
    } else {
      callback.apply(null, params); //params must be array
      //ES6: callback(...params);
    }
  }
}

test(callback_a);
test(callback_b, [" whatever"]);

答案 6 :(得分:0)

我刚刚在我的浏览器(ffox 51.0.1)中检查过以下内容:

function test(callback,other_args){if(condition){callback(other_args);}}

结果:

  • 条件=真
  • 试验(callback_a)
    • =>使用' a'
    • 显示提醒
  • 条件=假
  • 试验(callback_a)
    • =>
    • 没有显示任何内容
  • condition = true
  • 试验(callback_b,"佩佩&#34)
    • =>使用' b saypepe'
    • 显示提醒
  • 条件=假
  • 试验(callback_b,"佩佩&#34)
    • =>
    • 没有显示任何内容