this
は、あなたが関数を呼び出し、そこからオブジェクトを参照します。デフォルトでは、ウィンドウオブジェクトに設定されています。
function sayHello() {
alert("Hello, I'm " + this.nickname + ".");
}
function make (nickname) {
return {
nickname: nickname,
sayHello: sayHello
};
}
bob = make("Bob");
jim = make("Jim");
nickname = "Window";
bob.sayHello(); /////////////// alerts "Hello, I'm Bob."
jim.sayHello(); /////////////// alerts "Hello, I'm Jim."
sayHello(); /////////////////// alerts "Hello, I'm Window."
window.sayHello(); //////////// alerts "Hello, I'm Window."
setTimeout(sayHello, 0); ////// alerts "Hello, I'm Window."
setTimeout(bob.sayHello, 0); // alerts "Hello, I'm Window."
この動作を回避するには、少なくとも2つの可能性があります。
// a closure
setTimeout(function() { bob.sayHello(); }, 0);
を
この関数の 'this'の値は、最終的にタイマーが起動したときの周囲のコードと同じではありません。 'this'をタイマー関数の外の別のローカル変数に保存し、' this'の代わりにその変数を使用することができます。 – Pointy