2012-02-11 9 views
4

「これは」現在のオブジェクトに設定されている変数のであれば、jquery.each関数が 'this'変数を壊さないようにすることは可能ですか?

{ name: "The old this" } 

次のコードは、文句を言わない見つけることがループ

var array = [1, 2, 3]; 
$.each(array, 
    function(i, e){ 
    alert(this.name); 
    } 
); 

this.name、代わりに変数」でそれを変更しますループ実行中に 'e'と同じに設定されています

この変数を$。ループごとにclobberにすることはできませんか?

+3

。満足するために、 'this'を一時変数、' that'に格納し、 '$ .each'の中に' this'の代わりに 'that'を参照することができます。 –

+0

よろしくお願いいたします。その場合、通常のforループを単に使用することを検討するかもしれません。 – arcyqwerty

+0

単純なループでは、複雑ではない変数が使用されるため、実際には通常のループが最適です。 –

答えて

5

あなたはネイティブ.forEach代わりの$.eachを使用する場合は、第二引数を送信することにより、コールバックのthis値を設定することができます...

array.forEach(function(e, i) { 
    alert(this.name); 
}, this); 

。 MDN


から...

  • それともthisを変更することはしたくない場合は、普通forループ使用し、

    $.each(array, $.proxy(function(i, e) { 
        alert(this.name); 
    }, this)); 
    
3

ローカル変数にthisを格納してから、eachループ内で使用できます。これを試して。

var data = this;//where this = { name: "The old this" } 
var array = [1, 2, 3]; 
$.each(array, 
    function(i, e){ 
    alert(data.name); 
    } 
); 
this

ループeach内部は、配列の各要素を指します。あなたはIE8を含む古いブラウザを、パッチを適用する必要があります

0

...希望this値を持つ関数を返すためにjQueryの$.proxyを使用することができます。

var array = [1, 2, 3]; 
for (var i = 0; i < array.length; i++) { 
    // operate on array[i] 
    alert(this.name); 
} 

jQueryの.each()の動作を変更することはできません。 thisに設定されています。 .each()イテレータは便宜的に意味されています。したがって、実際にはforループよりも便利な場合にのみ使用してください。

thisを別の変数に保存する方法についてのその他の回答があります。完全性、もう一つの解決策、ネイティブJSを使用して$.proxyに類似するため

0

は、Function.prototype.bindを使用することです:

ことはできません
// wrapper function to set `this` scope. 
(function() { 

    $.each([1, 2, 3], (function(i, e) { 
    alert(this.name); 
    }).bind(this)); 

}).call({ name: "The old this" }); 
関連する問題