付録2.1 var宣言は大事 |
ペントミノを移植しようと思い立った日には、JavaScriptの参考書を持っていなかったため、インターネット上のJavaScript解説ページを参考に書き始めました。参考にしたページでは変数はとくに宣言せずに使用しており、とくに気にもとめませんでした。そして一応書き終えて動かしてみると、どうも動作が変です。JavaScriptにはデバッガがない?(あるのかもしれませんが知らない)ので、所々にwrite文を挿入し変数を書き出してみると、再帰呼び出し時に変数がスタックされていません。えっ、JavaScriptって再帰呼び出しができないの? 自分でスタックするのか? と悩むこと半日。ひとまず本屋にでかけることにしました。
本には再帰呼び出しの例が載っていましたが、どれも階乗(n!)を求める例で変数は引数だけという簡単なものなので参考にならないのでした。パラパラとページをめくってみると、他の例題で変数にはvar宣言をしていることに気づきました(気ずくのが遅い)。変数の解説をみると変数はvar宣言するのが正当のようです。
サンプルを書いてみると、宣言しない変数はグローバル変数のようになるようです(紛らわしい仕様だ)。通常の関数だと殆ど問題ないですが、再帰呼び出し関数のときは重要な問題です。と、いう訳で、var宣言は重要なのでした。
以下はvar宣言の有無により動作がどう変わるか試したサンプルソースと結果です。変数 j は宣言してないので値がスタックされてないことが分かります。
var宣言の有無と再帰呼び出し ソース function test(i) { j = i; var k = i; document.write("(a) i=",i," j=",j," k=",k,"<BR>"); if (i<5) test(i+1); else return; document.write("(b) i=",i," j=",j," k=",k,"<BR>"); } test(1);結果 (a) i=1 j=1 k=1 (a) i=2 j=2 k=2 (a) i=3 j=3 k=3 (a) i=4 j=4 k=4 (a) i=5 j=5 k=5 (b) i=4 j=5 k=4 (b) i=3 j=5 k=3 (b) i=2 j=5 k=2 (b) i=1 j=5 k=1
Copyright (C) Nakamura 1999 |