this
を参照することについて誰も言及していないようですinvoking object
。
window.sayHi=function(){
console.log(this.name);
}
window.name="Window"
window.sayHi();//=Window
var obj={
name:"obj"
}
obj.fn=window.sayHi;
obj.fn();//=obj
上記のコードは、関数を渡すとthis
コンテキストが変更されることを示しています。それを望まない場合は、関数の代わりにクロージャーを渡すか、 call、applyまたはbindを使用できます。
//closure example
obj.fn=(function(w){//w is available because the returned function is a closure
return function(){
w.sayHi();
}
}(window));
obj.fn();//=Window
//using call
obj.fn.call(window);//=Window
//using apply
obj.fn.apply(window);//=Window
//using bind
var boundFn=obj.fn.bind(window);
boundFn();//=Window
それは、関数を別のオブジェクトのパラメーターとして渡すときでした。コンストラクター関数を使用するthis
と、関数本体内で作成されるオブジェクトが参照されます。
ただし、関数を渡すと、次のようにならない場合があります。
var obj={
name:"obj"
}
var Test=function(){
this.name="Test";
}
Test.prototype.sayHi=function(){
console.log(this.name);
};
var t=new Test();
obj.fn=t.sayHi
t.sayHi();//=Test
obj.fn();//=obj
これは、オブジェクト インスタンス関数を setTimeout またはイベント ハンドラに渡すときに、ほとんどの人が陥る落とし穴です。
someButton.onclick=t.sayHi;//when button is clicked this will be the button clicked
setTimeout(t.sayHi,100);//when sayHi is executed 'this' will be window
コンストラクター関数の本体内に存在する obj1 に関する質問に答えるには; いいえと思います (少なくとも Firefox ではそうではありません)。仕様へのリンクはありませんがthis
、コンストラクター関数が戻ると obj1 が設定されます。
//clean up window.t
delete window.t;
var Test=function(){
this.name="Test";
console.log("and window.t is:",window.t);//undefined
}
Test.prototype.sayHi=function(){
console.log(this.name);
};
window.t=new Test();
コンストラクター関数、プロトタイプ、継承、オーバーライド、super の呼び出しの詳細については、こちらをご覧ください。