Memo for Javascript

何年もこのスクリプトに関わっても、まだまだ基本的なことが分かっていない。

■その1

addEventListener,attachEventで登録した、イベントハンドラ内でthisの指す参照先は、そのイベントが発生したオブジェクトである。
しかし、DOM0の方法(onXXXX=YYYY;)で登録すると、thisの参照先はwindowである。

ややこしい・・・。DOM0の方が、クロスブラウザを気にしなくていいので便利なのですが、複数のイベントハンドラを登録したり、管理したり・・・したいときは不便なんですよね。ケースバイケースですね。

■その2

いままで敢えて気にしなかったのですが・・・調子に乗ってバカバカとインスタンスを作ってると、やっぱり気になるそれの解放処理です。Javascript では、他のスクリプト言語と同じく、明示的にインスタンスの解放を行う必要はありません。たぶんバックグラウンドでどこからも参照されなくなったインスタンスはガーベージコレクタ(GC)によって整理されているんだと思います。

で、javascriptのキーワードに deleteというものがあります。これは要はプロパティーを削除するものなんですが、変数もdeleteすることができるんだそうだ。・・・というか、変数自体もプロパティーなんですね・・・。

関数を定義して制御が関数に渡ると、Activationオブジェクトっつーのができて、関数内で var a = 0; のようにローカル変数を宣言するというのは、それはActivationオブジェクトのプロパティーを追加するということ、なんだそうな。

う~ん、まだまだ知らないことが多すぎるし、そんなことまで知る必要はないのだが・・・。

■その3

関数の外で変数を定義すると、グローバルオブジェクトのプロパティで、Webブラウザ上では、それは window オブジェクトであったりするわけで・・・で、ここでも、どういうことなんろう、これ? みたいなことある。

関数外の外で、var a = 1; と宣言すると、関数内からでもアクセスできるグローバル変数になります。ブラウザ上では、つまり、window.a としてアクセスできるわけです。でもこれを、delete a; とすると・・・削除されません。alert(a)などとすると、依然として 1 が表示されます。
グローバル変数を定義する方法はもう一つあります。それはつまり、var をつけずにいきなり a = 1; とかやってしまうわけです。
この方法だと、たとえ関数内で a = 1 としても この a はグローバル変数になります。
で、これだと、delete a; とすると、削除されるんですよね。整理すると・・・。

var a = 100; // var 付きで宣言。
window.alert(a); // 100 が表示される。
delete a; //削除されず、falseが返る。
window.alert(a); // 削除されないので、100 が表示される。

b = 100; // var なしで宣言。
window.alert(b); // 100 が表示される。
delete b; // true が返る。
window.alert(b); // 削除済なので、undefined と表示される。

問題は、削除が成功したらこのメモリはいつ解放されるのか? ということで、でもこれはjavascriptの実装の問題になるので、メモリが解放されるかもしれないし、終了するまで解放されないのかもしれない。

コメントを残す