3

Google は、この質問に対する答えを見つけようとしても役に立ちません! :(

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

ここには 2 つのオプションがあります。

1) 一時変数を使用してオブジェクトの参照を格納します。

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

この方法を選択すると、「ローカルthis」(getJSON ハンドラー コンテキスト オブジェクトとして) と「オブジェクトthis」の両方をハンドラーで簡単に使用できます。ただし、もちろん、その一時変数を定義する必要があります。selfは、この目的で通常選択される最も一般的な名前の 1 つですが、実際には、他の変数の名前と重複しない限り、利用可能な任意の識別子にすることができます)。

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参照しようとしている は、コールバック内のコンテキストを参照する によって隠されていthisますgetJSON。別の変数名を使用してください。

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 に答える