05 02 2007 javascript Tweet
javascript第3版を読んでから、WEB+DB PRESS Vol.35のAjax特集など読み返していたら、オブジェクトのメソッドをイベントハンドラにするっていうところでちょっと分からないことがあった。
function Human(name){ this.name = name; } Human.prototype = { sayMyName: function(){ alert('My name is' + this.name + '.'); } }; var kzfm = new Human('kzfmix'); setTimeout(kzfm.sayMyName, 1000);
はだめで、
setTimeout(function(){kzfm.sayMyName()}, 1000);
とする必要があると。一緒に乗ってたコンストラクタでやる例をみても、あー、クロージャなんだなってことで納得したんだけど、クロージャ使わない最初の例だとthisって何を指すんだろうと気になったので調べてみた(googleで)。
このコードがなぜいけないかというと、イベントに渡された関数オブジェクトに含まれるthisが参照するのは、インスタンスのメソッドではないからだ。何をさしているかというとこの場合、thisはelementノードをさしている。
ふむー。なるほど。しかしjavascriptの場合ダンプってどうやるのかは分からずじまい。perlのData::Dumperみたいのはないんだろうか。
と思って、
あとでちょっと使ってみる。