2013-01-31 35 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) 
    } 
};