2011-03-28 62 views
7

我发现自己使用一种奇怪的方式来添加回调函数到我的函数,我想知道是否有更通用的方式来添加回调函数,最好的情况下,我会有一种情况,所有的我的函数检查最后一个给定的参数是否是一个函数,如果是这样的话,将它用作回调函数。添加回调函数 - 总是

这是我做到了过去:

var myFunc = function(obj) { 

    if (arguments.length > 0) { 
    if (_.util.typeofObj(arguments[arguments.length-1]) === Function) { 
     var callback = arguments[arguments.length-1]; 
    } 
    } 

    // some code ... 

    if (callback !== undefined) { 
    callback(); 
    } 

}; 

var foo = myFunc(myObj, function(){ 
    alert('Callback!'); 
}); 

有什么建议?

回答

5

如果您真的想要,可以使用.cb原型扩展Function.prototype。喜欢的东西:

Function.prototype.cb = function(cb){ 
    var self = this; 
    return function(){ 
     self.callback = cb || function(){}; 
     self.apply(self, arguments); 
    } 
} 

那么你的代码将压缩到:

var myFunc = function(obj){ 
    // some code 

    this.callback(); // callback will always be defined 
} 

,呼叫会略有变化:

myFunc.cb(function(){ 
    // callback code 
})(myObj); 

只是一个想法。无论你想要什么,都可以使语法变得非常简单。

+0

完美,这是主意,thx – ezmilhouse 2011-03-28 20:28:20

+0

在这种情况下,它可能并不重要,但是,可能希望避免使用'self',因为它是全局变量(但不是保留的)。 – Shaz 2011-04-26 00:12:50

5

不知道你正在尝试做的,但方式来增加,似乎更直接的回调:

function(obj, callback) { 
    if(callback) { 
     callback(); 
    } 
} 
+0

或导致一些头部划伤,简称为'回调&&回调()' – Jacob 2011-03-28 20:16:10

+8

@Jackob:typeof运算回调==“功能” &&回调()是清洁 – Andrey 2011-03-28 20:19:00

+0

THX安德烈,如果使用PARAMS – ezmilhouse 2011-03-28 20:30:11

13

我更喜欢一个正式的参数:

var myFunc = function(obj, callback) { 
    ... 
} 

这样,它显然有回调。您也不必乱用arguments对象;您可以检查callback是否为undefined,然后检查它是否属于合适的类型(Function)。

+1

使用后想最好的解决办法原型解决方案几个星期了,我转向了你的建议,它只是更容易阅读,发现它是一个非常重要的eye 012 – ezmilhouse 2012-01-10 09:53:24

+0

@ezmilhouse是的,有更少的“魔术”发生,因为形式参数是显而易见的:) – 2012-01-10 16:33:36

+0

@ ezmilhouse我建议改变接受的答案,因为你提到你改变了你的方法。 – 2013-11-27 17:40:47