イナヅマTVログ

ActionScript 3, ローカル変数だと思ったらグローバルだったのね

| 0件のコメント

匿名関数内の変数はローカル変数かと思ったらグローバル*扱いだったので、ちょっと不思議だと思ったのでメモしとく。
*タイムライン変数っていうんだっけ…

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var w1:Number;
function getStageWidth () :void {
	w1 = stage.stageWidth;
}
trace(w1); //NaN
 
var w2:Number = function ():Number {
	return stage.stageWidth;
}();
trace(w2); //550
 
(function () {
	var w:Number = stage.stageWidth;
})();
trace(w); //550

line:5
関数getStageWidthでの変数w1はローカル変数なので、traceしてもNaNになる

line:7
匿名関数から値を返す。
これでも関数が実行される。

line:12
この形の匿名関数内の変数はグローバル扱いになる。

なんか不思議。

ちなみに以下の形式はコンパイルエラーになる。

var w2:Number
function () {
	w2 = stage.stageWidth;
}();

次のようにしてもNaNになった。

var w3:Number = function ():void {
	w3 = stage.stageWidth;
}();
trace(w3); //NaN

なんとなくこれは理解できる。
戻り値がvoidを代入だもんな。

line:12の形の匿名関数内の変数はローカル変数になると思い込んでいたので教訓にしたいと思います。

コメントを残す

必須欄は * がついています


このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください