Java から入って JavaScript を取り扱うと、「型のない変数なんて不潔だ」とか「本当に関数までオブジェクトでよいのか」とか、とんでもないことを言い出すのだが、今回はオブジェクトのコンストラクタまわりで誤解をしていたという話だ。
Java では、コンストラクタ内で宣言された変数はあくまでコンストラクタの中で使われる作業用の「ローカル」変数であるから、オブジェクトを「構築」した後は用済みで消えてなくなってしまう。一方、JavaScript ではどうか。コンストラクタ内で this.propName というように宣言されたものはオブジェクトのプロパティである。そして var varName のように宣言されたものは Java 同様、一時的 (temporary) な変数である。と思っていたのが間違いだった。
"this.propName" と "var varName" は共にプロパティと考えるべきであって、"this.publicProperty" と "var privateProperty" と捉えるのが正解のようだ。ただし、厳密には var 宣言はプライベートプロパティとローカル変数の二種類があって、オブジェクト構築後参照されない var 宣言変数はガベージコレクションによって消去されるのだ。
イベントハンドラでは、キーワード this はハンドラの属するオブジェクトである。したがって、他の (オリジナル)オブジェクトメソッドをイベントハンドラとして this を使うと、それは (オリジナル)オブジェクトを指すのではなく、ハンドラの属するオブジェクトになってしまう。ところが、var 宣言された変数なら、オリジナルオブジェクトのプライベートプロパティとして取り扱われるのだ。
とにかく、酔っ払いの解説してはこれが限界だ。正直いって、明日素面でこれを読んで何を言わんとしていたか理解できるか甚だ不安である。
ドラゴンズファンにとって寂寞たる夜に記す。