【问题标题】:Passing a reference to an object to a callback function in jQuery [duplicate]将对象的引用传递给jQuery中的回调函数[重复]
【发布时间】:2012-09-12 18:09:24
【问题描述】:

可能重复:
$.ajax context option

我有一些看起来像这样的代码:

$.post(self.baseUrl + 'api/method',
        {param1: data},
        function (response) {
            // Do something
        });

我想将 self 对象的引用传递给回调,我想它会是这样的:

$.post(self.baseUrl + 'api/method',
        {param1: data},
        function (response, self) {
            // Do something
        });

但是,它不是这样工作的,jQuery 文档没有显示使这成为可能的方法,粗略的 Google 搜索也没有找到任何东西。这可能吗?我该怎么做?

【问题讨论】:

  • 你想用那个对象做什么?
  • @jhonraymos 递归调用包含这段代码的方法
  • @AndreasNiedermair 我投票反对关闭这个 - 它问的是非常相似的事情,但问题来自不同的方向。这个问题需要一个解释有一个上下文选项的答案,而建议的副本是询问如何使用该上下文。

标签: javascript jquery callback


【解决方案1】:

@karim79 显示了最佳解决方案。我只是想展示一些其他可能的方式

var App = {
    baseUrl: "http://.../",
    fetchData: function() {
        var self = this;
        $.post(self.baseUrl + 'api/method', {
            param1: data
        }, function(data) {
            self.onDatafetch(data);
            //or
            globalDataFetch(data, self);
        });
    },
    onDatafetch: function(data) {
        this.showMsg();
    },
    showMsg: function() {
        alert("Success");
    }
}

App.fetchData();

function globalDataFetch(data, object){
   // received data and object
}

【讨论】:

    【解决方案2】:

    如果您使用$.ajax 方法,您可以指定上下文:

    $.ajax({
        type: "post",
        context: self,
        data: {param1: data},
        success: function (response) {
            console.log(this); // now 'this' refers to self
    
        }
    });
    

    【讨论】:

    • 谢谢。这正是我所追求的。
    【解决方案3】:

    你为什么要那样做?

    你可以很容易地使用闭包:

    var param1 = data;
    $.post(self.baseUrl + 'api/method', function (data) {
        // access param1 here
    });
    

    【讨论】:

    • 这是在self变量所代表的对象的一个​​方法里面,而在callback里面我其实是递归调用这个方法的,所以需要传递一个引用。
    • 实际上,如果您在递归调用之后,您不需要参考。只要记住范式:范围的每个变量都可以从每一行(在该范围内)获得,无论它在哪里声明 - 这是因为编译器将声明移到顶部(但不是赋值,这可能会在稍后完成) - 见这个例子jsfiddle.net/dittodhole/x359K
    • 顺便说一句...递归可以,不是在每种情况下,都可以用堆栈代替-因此这可能是实现的更好选择...
    • 尽管如此:您不需要context - 这可以通过闭包来完成!只需引入一个新变量(并查看我的小提琴以获得更多提示)......
    猜你喜欢
    • 2018-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多