2011-03-28 65 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