旧それなりブログの跡地、画像やスタイルやJSなどが壊れてることがあります。

thisの実体を決定するロジックがわからない

2007年5月7日

javascriptで、こういうクラスがあったときに

var Human = function(){
this.word = "Hello";
};
Human.prototype.talk = function(){
alert(this.word);
};

それを使ってこう書いたときと

var h = new Human;
document.getElementById("hoge").onclick = function() {
h.talk(); // "Hello"を出力
};

こう書いたときに

var h = new Human;
document.getElementById("hoge").onclick = h.talk(); // undefinedを出力

thisの実体が変わりますが
このthisの実体を決定するJSのルールがわかりませぬ。

実装する時に、そこがわからないので
「applyとcallの第一引数で指定した場合は大丈夫」
「オブジェクトを指定して関数を呼んだ場合は大丈夫」
「それ以外は呼び出した要素がthisに入る」
という風に、ほぼ暗記で把握しておりますが・・・。
thisについてのいいエントリが有ったら
是非、教えて下さい。

***追記***
thisはダイナミックスコープの変数で
var宣言したものはレキシカルスコープの変数だったからだというので
なんとなく・概ね・わかったつもりになりました。
心にささるまで理解できたら、別に書こうと思います。
参考資料

  • 「まるごとJavaScript&Ajax!」の「FlashのActionScriptで関数型風プログラミング」の項目
  • Functional Programming