2009-01 << 2009-02 >> 2009-03

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);
}

と書くのが正解.

2009-01 << 2009-02 >> 2009-03