2011-02-21 11 views
2

私は名前空間を持つJavascript関数を持っていますが、私は関数を実行するためにPrototypeを使用しています。例コード:配列のループで 'this'をバインドする

GUI.Title = { 
initialise: function() { 
    var elements = $$('a'); 

    this.show(); /* now it refers to the namespace */ 

    elements.each(function(element) { 
    this.show(); /* this refers to the window object, not to the namespace */ 
    }); 

}, 
show: function() { 
    element.show(); 
} 
} 

「これ」は、各機能の外側の名前空間を指し、それぞれがウィンドウを参照します。

誰かが私の名前空間へのリファラーとしてeach-loopで 'this'をどのように使うことができるか説明してもらえますか?

私はプロトタイプを使用しています。

答えて

11

プロトタイプのbindメソッドを使用して、thisがその機能内の意味を変更します。

elements.each(function(element) { 
    this.show(); 
}.bind(this)); 
+2

+1、あなたの答えはプロトタイプ固有なので、 - 私は私の答えがより一般的なjavascriptのやり方であることを示すために私の答えを編集しました。 – hvgotcodes

+2

将来(あまりにも遠くない、私は願っています)、これは有効な "javascriptのやり方"になります、bindはECMAScript第5版仕様の一部になりました。 :) – CMS

+0

多くのおかげで、私は 'バインド'について知っていましたが、私はこの問題を解決するための文法を知らなかった!今私は知っている、感謝:)時々プロトタイプのマニュアルは理解するのが少し難しいです... – Sander

7

クロージャを作成している何をやっている

var scope = this; 
elements.each(function(element) { 
    scope.show(); /* this refers to the window object, not to the namespace */ 
}); 

this.show(); /* now it refers to the namespace */ 

elements.each(function(element) { 
    this.show(); /* this refers to the window object, not to the namespace */ 
}); 

を置き換え、「スコープ」VARは、辞書的にあなたの各機能に「インを閉じた」ます。このアプローチはプロトタイプ固有ではなく、一般的なjavascriptテクニックです。

+4

これは機能します。 Prototypeが利用可能なので、 'bind'はちょっとちょっとです。プロトタイプを使用していない人は誰でも読むことができますので、アップヴォートを教えてください。 – Nick