振り返ってもしやと思い、関数内で変数を定義してみたが駄目だった。この場合、関数内において let で作った aa はローカル変数になるようだ。
これは let を var にしても同じだった。グローバルな変数として定義するには this をつけなければいけない。
それなら初めから関数を使うメリットはない。
ラムダ式で書いた部分の this は window だが、独立のリスナーを作った場合の this はボタンなどのオブジェクトになる。
こうしたものに、変数や関数を後付けすることができる。
【new をした場合】
new をした関数の中で、this は作られつつあるオブジェクトを定義する。
インスタンスに対する変数および関数はいちいち this をつけなければいけない。これはかなり面倒くさい。
this をつけていない、下のプログラムで aa のような変数は、オブジェクト言語の local 変数と同じだ(6/12 改定。もともと「static 変数と」としていましたが、オブジェクトに依らない static 変数のような振る舞いはありません)。
面白いことに、インスタンスの中から呼び出された this の無い関数の中で、this は window に戻っている。
まあ、それはそうだ。それを避けるために this が必要だったのだから。
避ける方法として、後の方に置いた this のない関数をまず呼び出すという、先に紹介した方法はここでは使えない。
なぜなら、this のない関数内の this は window に戻ってしまうわけだから。
しかし、呼び出しがコンストラクタからのみの場合には解決策がある。それは this を変数として引き渡してしまう方法だ。例えば次のように。