【问题标题】:JavaScript overloading with a callback带有回调的 JavaScript 重载
【发布时间】:2012-03-22 21:44:30
【问题描述】:

遵循this question 中推荐的模式,我们有类似的东西:

function foo(a, b, opts) {

}

foo(1, 2, {"method":"add"});
foo(3, 4, {"test":"equals", "bar":"tree"});

然后如何将回调作为最终参数包含在内?我有函数foo() 应该能够处理这两个:

foo(x, y, function() {
  // do stuff
});

foo(x, y, z, function() {
  // do stuff
});

有什么建议吗?

【问题讨论】:

  • 也许我误读或误解了,但您是在问是否可以将函数放入对象中?
  • 这也可以,但找不到是否可行
  • 确实有可能。 {"oscar" : function () { console.log("I live in a trashcan.") }} 因此,假设您将对象命名为 foo,则 foo.oscar 将运行该函数。

标签: javascript callback overloading


【解决方案1】:

所以基本上你想接受可变数量的参数,然后是回调作为最后一个?类似于 PHP 的 array_udiff 的工作方式?

这很简单:

function foo() {
    var args = [], l = arguments.length, i;
    for( i=0; i<l; i++) args[i] = arguments[i];

    var callback = args.pop();
    // now you have your variable number of arguments as an array `args`
    // and your callback that was the last parameter.
}

【讨论】:

  • 为什么你会通过for循环创建参数数组的精确副本,然后弹出回调,而不是仅仅使用arguments
  • 因为arguments 是一个类似数组的对象,而不是一个实际的数组。
  • 你可以使用var args = Array.prototype.slice.call(arguments)
  • @evan.bovie 可以,但在旧版浏览器中不允许;)
  • @NiettheDarkAbsol 这就是我们放弃支持或使用垫片的时候。
【解决方案2】:

我想说只使用 arguments 对象:

function foo(a, b) {
    // Do stuff


    // Done stuff


    var alength = arguments.length;

    // If more than 2 arguments and last argument is a function
    if(alength > 2 && typeof arguments[alength - 1] === 'function')
        arguments[alength - 1].call(this);
}

【讨论】:

  • 但是为什么你使用 window.arguments 而不是局部参数变量呢?
【解决方案3】:

您可以执行类似于.apply 的操作。 (不像.call

function foo(args, cb) {}

foo(['a', 'b', 'c'], function() {} );

如果需要,您可以使用 .shift 将它们放入变量中:

function foo(args, cb) {
    var a = args.shift(),
        b = args.shift();
    // and so on...
}

【讨论】:

    【解决方案4】:

    最终采用以下解决方案:

    foo(args) {}
    
    foo({"x":"add", "callback": function() {
      // do stuff
    }});
    
    
    foo({"x":"equals", "y":"tree", "callback": function() {
      // do stuff
    }});
    

    然后简单地检查最后一个参数值是否是一个函数,上面是@PaulP.R.O. 的解决方案:

    if((arguments.length > 1) && (typeof arguments[arguments.length - 1] === 'function')) {
      var callback = arguments[arguments.length - 1];
    }
    

    【讨论】:

      猜你喜欢
      • 2012-08-18
      • 2011-06-26
      • 1970-01-01
      • 2012-10-11
      • 2014-04-19
      • 2019-12-26
      • 1970-01-01
      • 2013-08-11
      • 2013-12-27
      相关资源
      最近更新 更多