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みたいな感じ


このへんは自分で作っているインタプリターにもハッシュを実装して取り込んでみたい。