首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >JavaScript作用域-将回调传递到已定义的函数

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

Stack Overflow用户
提问于 2013-01-31 22:27:41
回答 2查看 376关注 0票数 1

标题有点奇怪,不太知道用句子来解释它的最佳方式……

目前有一个具有三个函数的对象: funcFailure、funcSuccess和func。func包含一个jQuery ajax请求,其中this.funcSuccess是成功回调,funcError是错误回调。对于要传递回的任何成功值,都会向func传递一个回调,但是这个回调需要在funcSuccess代码中执行。

代码如下:

代码语言:javascript
运行
复制
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)
    }

  }

我想知道是不是有更好的方法来做这件事而不是:

代码语言:javascript
运行
复制
var that = this
$.ajax(
  { type: 'POST'
  , url: '/func'
  , success: function (res) {
      that.funcSuccess(res)
    }
  , error: this.funcError
  }
)

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-01-31 22:30:45

如果将回调显式地存储在对象中,这样就不必担心闭包作用域:

代码语言:javascript
运行
复制
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
EN

Stack Overflow用户

发布于 2013-01-31 22:54:42

您需要将callback传递给funcSucess,否则它将无法访问它。在这里使用闭包:

代码语言:javascript
运行
复制
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)
    }
};
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14628124

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档