あなたはOO用語で考えていますが、投稿したコードはOOではありません。Rob Wが彼の投稿で述べたように、デフォルトthis
はwindow
またはundefined
厳密モードです。
this
特定の機能または状況が状況に応じて値を提供する場合にのみ、値を変更します。
関数がクラスシミュレーションで使用される場合、つまりnew
、単に呼び出されるのではなく(を介して)インスタンス化this
される場合、期待どおりにインスタンスを指します。
function Dog(name) {
this.name = name;
alert(name);
}
var fido = new Dog('Fido'); //alerts 'Fido'
コンテキストを提供する他の状況にthis
は、イベントハンドラー(少なくともaddEventListener
モデルでは、古いIEではない)や、コンテキストを自分で使用call()
またはapply()
手動で設定するときが含まれます。this
this
また、 JavaScriptの関数「owner」を指しているとは考えないでください。イベントではthis
、影響を受ける要素を指しますが、その要素をコールバック関数を「所有している」と考えるのは役に立ちません。単にその要素のコンテキストで実行されているだけです。
最後に、Quentinが述べたように、の外部コンテキストを参照する方法はありませんthis
。最初に変数にキャッシュする必要があります。
function Dog() {
var that = this;
setTimeout(function() {
alert(this); //window - setTimeout() has overwritten the 'this' context
alert(that); //we reference our cached, outer context
}, 500);
}
var fido = new Dog('Fido');