2012-03-22 60 views
2

this question推荐模式超载,我们必须一个类似于:JavaScript和回调

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

有什么建议?

+0

也许我误读或误解,但你要问,如果你可以在把一个函数一个东西? – Snuffleupagus 2012-03-22 21:47:30

+0

这也可以工作,但不能找到如果这是可能的 – 2012-03-23 17:01:56

+1

这确实是可能的。 '{ “奥斯卡”:函数(){的console.log( “我生活在一个垃圾桶”)}}'所以,假设你命名你的对象foo,foo.oscar将运行功能。 – Snuffleupagus 2012-03-26 13:19:18

回答

0

结束了以下解决方案去:

foo(args) {} 

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


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

,然后简单地检查,看看最后的参数值是一个函数,阿拉@PaulP。 RO的解决方案如上:

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

我想说的只是使用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); 
} 
+1

但你为什么使用window.arguments而不是本地参数变量? – Bergi 2012-03-22 21:58:08

+1

@Bergi我......我不知道为什么我那么做。 – Paulpro 2012-03-22 22:05:36

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. 
} 
+1

到底为什么你会用'for'循环创建参数数组的精确副本,然后在弹出的回调,而不是仅仅使用'arguments'? – joncys 2012-03-22 21:55:18

+1

因为'arguments'是类似阵列的对象,而不是实际的阵列。 – 2012-03-22 22:01:24

+0

你可以只用'变参= Array.prototype.slice.call(参数)' – 2013-12-11 01:49:25

1

您可以做类似于.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... 
}