JavaScriptの怖さを垣間見た。
すべてのオブジェクトをキーにできるハッシュの様なもの - IT戦記
こないだ、よくわかんないまま書いて恥をかいたので、ちゃんとサイの本を読みながらプログラムの動きを追ってみました。
イメージ図
関数1はDictinaryっていう名前で宣言された一番外側の関数。
関数2はdictに入ってる関数。Dictionaryの戻り値
関数3は
function(){ return undefined; }
関数4は
function(a) { return a === k ? v : state(a) }
前提
サイの本に書いてたこと。
- 関数は、自分が定義された時のスコープをしっかり覚えている。(イメージ図の中で「関数○生誕の地」って書いてあるトコ)
- 定義された関数が呼び出されると、関数は自分が定義されたスコープの内側に、自分自身のスコープをプゥッとふくらませて、そこで関数を実行する。(イメージ図の中で「関数○のスコープ」って書いてある丸いところ)
- 関数の引数と、関数の中でvar宣言された変数は、「関数○のスコープ」内でローカルになる。
- 関数の実行中に見たことのない変数名が出てくると、外側のスコープに向かって変数を探しに行く。
たぶんこんな感じ
関数1のスコープ内に「関数2のスコープ」がいくつも並んでいる。
先頭にある「関数2のスコープ」の「state」変数には、undefinedを返す関数3が入っている。
二つめ以降の「関数2のスコープ」の「state」変数には、一つ前の「関数2のスコープ」で定義された関数4が入っている
「self」変数の「state」プロパティには、末尾の「関数2のスコープ」で定義された関数4が入っている
「関数2のスコープ」が配列みたいに並んでいて、それぞれが1つ前のスコープで定義された関数を持っていて、スコープが数珠みたいに繋がっているので、dict(キー)ってやると、数珠をどこまでもさかのぼっていけるみたいです。
もうちょっと詳しく
途中までパワーポイントに書きながらやってたのですが、だんだん狭くなってきたのでギブアップしました。あまりまとまってないですが、せっかく作ったので置いときます。
まとめ
思ったこと
JavaScriptって実はこんなに難しい言語だったんだなあ(トホホ・・・)