【问题标题】:can we give a callback with parameters?我们可以给一个带参数的回调吗?
【发布时间】:2012-12-08 18:49:09
【问题描述】:


    function abc(arg1,arg2, callback){
        console.log(arg1 + arg2) // I am doing something really interesting
        if(callback){
        callback(arg1+ arg2)
        }
    }
    function add(){
            console.log("from call back " + arguments[0])
    }

    var a =10;
    abc(1,2, add)


这很好用,但是如果我们需要向回调发送一些额外的参数,我们应该怎么做?
在这里,除了(arg1+ arg2),我还需要从abc 的调用者到回调设置一些其他参数
而且,abc(1,2,add)abc(1,2,add()) 有什么区别??
谢谢:)

【问题讨论】:

  • 你想从哪里向回调传递“一些额外的参数”?

标签: javascript callback arguments


【解决方案1】:

add和add()的区别: add 是一个函数,add() 是函数的返回值。 如果你想获得更多的函数参数。使用参数对象 每个函数都有一个参数对象 参数[0] == 1 个参数[1] == 2 个参数[2] == 添加。

【讨论】:

    【解决方案2】:
    • abc(1,2,add) => 将函数参数作为“函数类型”。这就像给函数一个指针以便以后调用它。

    • abc(1,2,add()) => 调用add() 函数并将其返回值作为参数。

    你需要回调支持的不仅仅是一个参数吗?由于 JavaScript 是一种动态语言,因此只需使用更多参数调用相同的回调函数:

    • callback(1,2,3,4)
    • callback(1,2,3,4,5)
    • callback(1,2,3,4,5,6)

    JavaScript 对函数签名并不严格:函数的参数与调用者提供的参数一样多。

    例如,如果你有这样的回调函数:

    function(a, b) {
    
    }
    

    后来你这样称呼它:

    function("hello"); // Where's the second argument??
    

    JavaScript 不会抱怨。只需 b 将未定义。

    【讨论】:

      【解决方案3】:

      您可以使用原始函数中的参数调用回调,也可以在函数调用中为回调提供参数:

      function f1 (args, callback, params) {
          callback.apply(this, params); // Params needs to be an array
          callback.apply(this, [args]); // This would call callback with 1 param - args
          callback.call(this, args); // This is the same as the line above
      }
      
      function f2 () {
          for (item in arguments) {
              console.log(item);
          }
      }
      
      f1('arg', f2, [1, 2, 3]);
      

      如果您在参数中使用函数调用来调用您的函数,那么它将立即计算并且不会作为回调执行。

      【讨论】:

        【解决方案4】:

        abc(1,2,add)abc(1,2,add()) 的区别在于,在第二种情况下,调用add 的不是abc。结果是add 的执行速度比预期的要快得多,并且没有任何参数。

        向回调传递额外参数的常用方法是创建一个匿名函数来关闭参数:

        var a=10;
        var b=20;
        abc(a, b, function(text){
          add(a, b);
          console.log(text); //logs "abc"
        });
        

        【讨论】:

          猜你喜欢
          • 2011-10-06
          • 1970-01-01
          • 1970-01-01
          • 2023-04-10
          • 1970-01-01
          • 1970-01-01
          • 2021-10-27
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多