3

谷歌在试图找到这个问题的答案时没有帮助!:(

如何this.colour在这样的 jQuery 函数中正确地从父对象引用:

var obj = {
 colour: 'blue',
 do: function() {
  $.getJSON('getcolour.php', function(resp) {
    if (resp.colour == this.colour) { //<== this.colour doesnt = blue
     //match
    }
  });
 }
}
4

4 回答 4

4

您在这里有两个选择:

1)使用临时变量来存储对象的引用:

do: function() {
  var self = this;
  $.getJSON('getcolour.php', function(resp) {
    if (resp.colour == self.colour) { ... }
  });
};

如果您选择这种方式,您可以在处理程序中轻松获得“本地this”(作为 getJSON 处理程序上下文对象)和“对象”。this但是,当然,您必须定义该临时变量。self是通常为此目的选择的最常见的名称之一,但它实际上可以是任何可用的标识符 - 只要它不与其他变量的名称重叠)。

2)使用为此正确的功能:$.proxy

do: function() {
  $.getJSON('getcolour.php', $.proxy(function(resp) {
    if (resp.colour == this.colour) { ... }
  }, this));
};

使用这种方法,您已经替换了处理程序的上下文对象 - 它现在指向this(作为定义do函数的对象)。

于 2012-11-20T13:41:15.700 回答
3

您需要获取对调用this 外部$.getJSON的引用:

do: function() {
    var self = this;
    $.getJSON('getcolour.php', function(resp) {
        if (resp.colour === self.colour) {  // use "self"
            // ...
        }
    });
}

或者,在 ES5 浏览器上,用于.bind将内部回调的上下文设置为this

do: function() {
    $.getJSON('getcolour.php', function(resp) {
        if (resp.colour === this.colour) {
            // ...
        }
    }).bind(this);  // set the callback's context
}

jQuery的$.proxy()功能也可以在早期的浏览器上使用,达到同样的效果。

于 2012-11-20T13:40:59.337 回答
3

this您试图引用的 被引用回调中的上下文的 a所遮蔽thisgetJSON使用不同的变量名。

do: function() {
    var self = this;
    $.getJSON('getcolour.php', function(resp) {
        if (resp.colour == self.colour) { //<== this.colour doesnt = blue
         //match
        }
    });
}
于 2012-11-20T13:41:23.707 回答
1

试试下面,我认为在你的代码中指的是 ajax 范围

var obj = {
 colour: 'blue',
 do: function() {
  var myObj=this;
  $.getJSON('getcolour.php', function(resp) {
   if (resp.colour == myObj.colour) { //<== this.colour doesnt = blue
 //match
}
 });
}
}
于 2012-11-20T13:41:32.867 回答