2013-01-31 39 views
1

標題有點怪異,不太清楚句子中解釋它的最佳方式...JavaScript範圍 - 通過回調已定義的函數

目前有一個有3個函數的對象; func,funcSuccess和funcFailure。 func包含一個jQuery ajax請求,其中this.funcSuccess作爲成功回調函數,funcError作爲錯誤回調函數。 func通過一個回調函數傳回任何成功值,但是這個回調函數需要在funcSuccess代碼中執行。

下面的代碼:

var Obj = 

    { func: function (callback) { 
     $.ajax(
     { type: 'POST' 
     , url: '/func' 
     , success: this.funcSuccess 
     , error: this.funcError 
     } 
    ) 
    } 

    , funcSuccess: function (res) { 
     // THIS IS WHERE CALLBACK IS NEEDED 
     callback(res.thing) 
    } 

    , funcError: function (res) { 
     debug(res) 
    } 

    } 

我不知道是否有一個整潔的方式做到這一點,而不是:

var that = this 
$.ajax(
    { type: 'POST' 
    , url: '/func' 
    , success: function (res) { 
     that.funcSuccess(res) 
    } 
    , error: this.funcError 
    } 
) 

肯定我失去了一些東西很明顯,只是不太與它今天...

+0

這沒什麼幫助,''callback'在'funcSuccess'中仍然是'undefined' - 你需要在那裏明確地傳遞它。 – Bergi

回答

1

如何顯式地將回調存儲在您的對象,所以你不必擔心關閉範圍:

var Obj = 

    { func: function (callback) { 
     //this.callback = callback; 
     $.ajax(
     { type: 'POST' 
     , url: '/func' 
     , success: $.proxy(this.funcSuccess, this, callback) 
     , error: $.proxy(this.funcError, this) 
     } 
    ) 
    } 

    , funcSuccess: function (callback, res) { 
     callback(res.thing) 
    } 

    , funcError: function (res) { 
     debug(res) 
    } 

    } 

編輯:我忘了把回調綁定到this。在JQuery中,您可以使用$.proxy來實現,請參閱上面的更改。

編輯:進一步整齊(jQuery 1.6允許這樣做)將回調作爲參數傳遞給$.proxy,因此不需要將其附加到當前對象。

+0

這不起作用。 – davin

+0

爲了擴展它不起作用,funcSuccess函數中的'this'就是$ .ajax函數。 剛看到編輯,忽略! – domudall

+0

@達文:你說的對,我改變了。 –

0

您需要將callback傳遞給funcSucess,否則它將無法訪問它。在這裏通過使用閉包:

var Obj = { 
    func: function (callback) { 
     return $.ajax({ 
      type: 'POST', 
      url: '/func', 
      success: this.makeFuncSuccess(callback), 
      error: this.funcError 
     }); 
    }, makeFuncSuccess(callback) { 
     return function funcSuccess (res) { 
      callback(res.thing); 
     }; 
    }, 
    funcError: function (res) { 
     debug(res) 
    } 
};