2012-11-20 73 views
3

谷歌沒有幫助試圖找到這個問題的答案! :(jquery參考父母

如何正確地從父對象jQuery的功能類似這樣的內引用this.colour來自:

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

只需使用'obj.colour' ... – Ian

回答

3

您需要獲取$.getJSONthis外部調用中的參考:

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()函數也可以在早期的瀏覽器上使用,以達到相同的效果。

+0

優秀。乾杯! (必須等待7分鐘才能接受答案) – Christian

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功能)。

3

您試圖引用的this正被this映射,該引用getJSON回調中的上下文。使用不同的變量名稱。

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

下面試試,我想在你的代碼指阿賈克斯範圍

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