JavaScript范围 - 将回调传递给已定义的函数

时间:2013-01-31 14:27:41

标签: javascript callback scoping

标题有点奇怪,不太清楚用句子解释它的最好方法......

目前有一个具有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
  }
)

很确定我错过了一些显而易见的东西,今天还没有用它......

2 个答案:

答案 0 :(得分: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,因此无需将其附加到当前对象。

答案 1 :(得分: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)
    }
};
相关问题