あなたは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');