2007年 02月 19日

ホイスト

ブロックレベルのスコープがないということは、関数が終了する前に変数が宣言されていれば、宣言される前に変数の読み書きが可能であるということです。これは、"ホイスト" と呼ばれる手法によるもので、コンパイラによりすべての変数宣言が関数の最上位に移動されます。たとえば、次のコードは、num 変数が宣言される前に num 変数の初期の trace() 関数が実行されてもコンパイルされます。

trace(num); // 出力 : NaN
var num:Number = 10;
trace(num); // 出力 : 10

しかし、コンパイラは代入ステートメントをホイストしません。このため、num の初期の trace() は数値データ型の変数のデフォルト値である NaN (非数) になります。つまり、次の例に示すように、変数が宣言される前でも変数に値を割り当てることができます。

num = 5;
trace(num); // 出力 : 5
var num:Number = 10;
trace(num); // 出力 : 10
http://livedocs.adobe.com/flex/2_jp/docs/00001822.html

ホイスト (hoist) っていうんだ。でも "変数 ホイスト" で検索してもこのドキュメントぐらいしかヒットしない。