2009-02-25 (水)
*ActionScript 変数のスコープ
ActionScriptの変数は静的なレキシカルスコープじゃない….分かっていたつもりだったけど,クロージャとか作ると躓きやすい.
forループのブロックの中などで宣言された変数を使ってクロージャを作成したりしても,変数はループが回る度に作られるわけではないので,意図した動作をしない.
for (var k:int=0;k<10;k++) { var j:int=k; f[k]=function():int{return j}; }
というようにクロージャを作って,たとえば f3 を呼んだ場合,返ってくるのは「3」ではなくて最後にjに代入した「9」になる.
for (var k:int=0;k<10;k++) { f[k]=function(j:int):Function{ return function():int{return j}; }(k); }
と書くのが正解.