JavaScript勉強会
毎週金曜は会社で勉強会なんですが、JavaScriptの勉強会でした。
JSでオブジェクト指向の話なんですが、
まずスコープは関数単位なんですね。いわゆる{}単位ではない。
で、thisなんですが、基本的にオブジェクト自身を指すのは普通なんですが、
ややこしいのは、DOM要素でイベントで呼ばれた関数とか、
prototype.jsでコールバック的に呼ばれた関数内の処理(updaterとか)
その場合、thisはオブジェクト自身では無く、
動かしている人自身になる。
イベント起動なら、window自身だし、ajaxのコールバックならそちらがthisになる。
(prototype要のbindをすればthisが適切に入る)
普通の言語、Cとかでコールバックすれば、それは関数ポインタの参照渡しだけど、
JavaScriptの関数は、実は変数に値で入っているので、プログラム自体が値渡しだから、
thisが何になるかは動的に決定されるということらしい
var a = function(a) { alert(a); } a(3); document.write(a);
aという変数に無名関数をセットして、()を付けて中身を読む=中身が実行される。
a自身に処理が(おそらくそのまま)値で入っているから、表示もできる。
実行すると3のアラートと
function (a) { alert(a); }
が表示される。確かに変数aには、無名関数が代入されている。
こう考えた方が解りやすいかも
var a = "function(a) { alert(a); }";
(代入されているモノは、実際は中間言語? functionが文字通りfunctionと入っていてはメモリの無駄)
var a = function(a) { alert(a); //misaki }
のaを表示させると
function (a) { alert(a); //misaki }
改行は詰ってるけど、コメントがそのまま入っている(^^;マジっすか?
JavaScriptの場合、メソッドとプロパティという区別はなく、
すべてが連想配列、ハッシュのkeyとvalueになっているらしい
ある意味すっきりした仕様?
<script> document.write("abc<br>"); document.write( document.write ); </script>
試しにこういうコードを実行してみる
documet.write("abc")というのは、documentのwriteメソッドを起動しているのではなく、
documentのwriteキーのハッシュ値を関数として引数"abc"を渡して動かすといイメージのはず
chromeでの実行結果
abc function write() { [native code] }
たしかにdocumet.writeにはwrite関数が値として入ってた(write関数の中身は組み込みだけど)
プログラムと値に区別がないのはLispみたいな感じ
このへんは自分で作っているインタプリターにもハッシュを実装して取り込んでみたい。