■
ぐにょぐにょ作業。
3回くらい「次はやる」と、書いたような気がするけど、全然やってなかったローカル変数まわりをやっと作業開始。
a24zのときは変数検索コンテキストまわりでSTL使ってたせいで、なんかスタックが書けなくなってたよ。助けて。
STLは使っちゃ駄目だ!!
それはいいとして、ローカル変数まわりは、SpiderMonkeyのソースが結構参考になる。今日、少し「へぇー」ってなったのが、クロージャ作るときに、その作ったときのスコープを関数本体に保存しとく、というところ。
クロージャというのは、一緒に変数スコープも持ってやらないといけないので、関数定義を実行するたびに、関数オブジェクトが作られてしまう。
と書こうとしたけど僕の文章では説明できないよ…なんか
function sugoi_loop( i ) { var x = nanika; for ( var j=0; j<i; j++ ) { function foo( ) { return x; } external_func( foo ); } }
こういうコードがあったとして、普通だと、fooが定義される度に、その定義したときのスコープを参照できるクロージャを作る必要があるんだけど、関数定義の部分に、「最後にその定義が実行されたときのスコープ」っていうのを持っておけば、作られるクロージャは一個で済んだりするよ。っていう話。
と、そんな感じで、SpiderMonkeyはそういう「スコープまわりで無駄なオブジェクトはできるだけ作らない。」っていう部分が、しっかり書いてあって、参考になるのですよ。