hatora's blog

日常の出来事や仕事のことなど/Java/開発/Web/IT

コールバック関数内のthis

長らくJavaでのサーバーサイドを担当していたのですが、斯く斯く然々あって
JavaScriptによるクライアントサイドを担当することになりました。


ここ1ヶ月強を経て、まぁ初心者を名乗れるくらいにはなったのかなと思っています。

JavaScriptのthis

Javaをやっていた人間からすると、なかなか理解しがたい部分です。

「4つのthis」なんて言われていますが、「呼び出し元オブジェクトがthisにバインドされる」と覚えておけばいいでしょう。
Javaと異なり、「自身のオブジェクト」ではないので注意が必要です。

コールバック内のthis

本題です。
「コールバック内のthisはwindowを指す」という内容をたまに目にするのですが、なんか違うよなーと思ったので。

setTimeout ・ setInterval

例として挙げられるのがsetTimeout・setIntervalなのがよくないですね。
setTimeout・setIntervalはwindowオブジェクトに属しているためです。


まずはオブジェクト生成

var obj = {
message:'メッセージ!!', 
callback:function(){
  alert( this.message );}
};
obj.callback();
//「メッセージ!!」が表示される


setTimeoutでのコールバック例

setTimeout( obj.callback, 1000 );
// undifinedが表示される


window(global)オブジェクトじゃない例

var obj2 = {
emit:function(target){
  target.callback();}
}
obj2.emit(obj);
//「メッセージ!!」が表示される

まとめ

thisって難しい