JavaScript 作用域 - 将回调传递给已定义的函数

标签 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
  }
)

很确定我错过了一些明显的东西,只是今天不太明白......

最佳答案

如何将回调显式存储在对象中,这样您就不必担心闭包范围:

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)
    }

  }

编辑:我忘记将回调绑定(bind)到this。在 JQuery 中,您可以使用 $.proxy 来完成此操作,请参阅上面的更改。

编辑:进一步整洁(jQuery 1.6 允许这样做),将回调作为参数传递给 $.proxy,因此无需将其附加到当前对象。

关于JavaScript 作用域 - 将回调传递给已定义的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14628124/

相关文章:

r - curve3d 找不到本地函数 "fn"

Javascript 函数作用域和提升

Outlook 2007 中的 Javascript 单击事件

Android:在 WebView 中单击会导致回调到 Android 应用程序

javascript - 传递通用 JavaScript 函数作为回调不会执行

javascript - 未使用回调时函数返回未定义,使用回调时,JS 说函数未定义

html - 仅仅为了拥有多个 Controller 而创建 Div 是一种不好的做法吗?

javascript - AngularJS - 在 ng-repeat 中过滤未定义的属性?

php - 如何单击图像的某些部分

javascript - 如何找出元素是否溢出(使用 jQuery)?