私はsimple javascript inheritanceのJohn Resigの優れたjavascriptクラスを使用していますが、私は「this」キーワードに関連していくつかの可変スコープの問題の周りに頭を浮かべています。他のjavascriptオブジェクトを含むjavascriptオブジェクトで 'this'をどのように扱うべきですか?
私の拡張クラスは少し私がtouchStartEventHandler
内側からEUNodeインスタンスを参照できるようにする必要があり、この
var EUNode = Class.extend({
// Methods
//-------------------------------------------------------------------------------
init : function(){
this.div = this.createDiv();
this.canDoStuff = true;
this.div.addEventListener(touchstart, this.touchStartHandler, false);
},
// Create Div
//-------------------------------------------------------------------------------
createDiv : function(){
// code to create a DIV element, add some classes and do some
// other useful stuff
},
touchStartHandler : function(event){
// In here, 'this' refers to the div element, so the
// following condition doesn't work
if(this.canDoStuff){
// do some stuff
}
}
});
のように見えるので、私は私はそう下記の
var EUNode = Class.extend({
// Methods
//-------------------------------------------------------------------------------
init : function(){
this._super();
// Store a reference to 'this' globally
self = this;
self.div = this.createDiv();
self.canDoStuff = true;
self.div.addEventListener(touchstart, self.touchStartHandler, false);
},
touchStartHandler : function(event){
if(self.canDoStuff){
// Now I can do stuff, but 'self' is now a global variable
// which isn't what I want. If there's more than one instance
// of EUNode, 'self' references the newest instance.
}
}
});
を試してみましたループで立ち往生した。グローバルな "自己"の範囲を制限するためには、 "this"キーワードを使用する必要があると思われますが、 "this"はイベントハンドラ内の何かを意味します。任意のヒント?
+1 'var'キーワードを省略すると間違っています。これにより、OPの範囲の問題に関してすべての違いが生じます。 – Tomalak
シンプルシンプルシンプル。私はコードをもっときれいに保つので、 'bind()'関数を好む。残念ながら、これは特にココアWebViewの実装のためのものです。 – gargantuan
@ガルガンタウン:Mmh。たぶんあなたはまだ 'Function.prototype'を拡張することができます。リンクを見てください。しかし、他の方法はどちらも悪くないし、この問題を解決するための一般的なプラクティスです。 –