ぐにょぐにょ作業。
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はそういう「スコープまわりで無駄なオブジェクトはできるだけ作らない。」っていう部分が、しっかり書いてあって、参考になるのですよ。