匿名関数内の変数はローカル変数かと思ったらグローバル*扱いだったので、ちょっと不思議だと思ったのでメモしとく。
*タイムライン変数っていうんだっけ…
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の形の匿名関数内の変数はローカル変数になると思い込んでいたので教訓にしたいと思います。