By | 2008年9月17日

昔にactionscriptの変数のスコープがfunctionスコープということを知らずに凄いハマったことがあって
それ以来は気をつけてはいたんですが、どうやらブロックスコープを実現できるみたいなので試してみた。

結論から言うと、withを使う。
actionscirpt1のころからwithの存在を知ってはいたけどコード量を短くする以外に使い道もわからなく
そんなに困ることもなく存在すら忘れ去れそうになっていましたw

でも、この子は非常に優秀です。できる子でした。
perlでいうlocalみたいなことができるんです。
素晴らしすぎます。今まで知らなかったことが残念で仕方ありません。

actionscript、javascript共に試したコードをつるしときます。

ver FlashIDE

1
2
3
4
5
6
7
8
9
10
11
var hoge:Number = 8;
 
trace("default:" + hoge);               // 8
(function():void {
    var hoge:Number = 10;
    trace("function:" + hoge);               // 10
})();
 
with( {hoge:1} ) {
    trace("with:" + hoge);               // 1
}

ver flex SDK(上のFlashIDEと対してかわりはありません。)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package {
    import flash.display.Sprite;
 
    public class Hoge extends Sprite{
        public function Hoge() {
            var hoge:Number = 8;
            trace("default:" + hoge);               // 8
 
            (function():void {
                var hoge:Number = 10;
                trace("function:" + hoge);               // 10
            })();
 
            with( {hoge:1} ) {
                trace("with:" + hoge);                // 8 <- これがおかしい
            }
        }
    }
}

ver javascript

1
(function(){var hoge=10;with({hoge:4}){alert(hoge);}alert(hoge);})();   // 4が表示され、次に10が表示される

Flash IDEから使用した場合は問題なくブロックスコープが実現されています。

ただ、、、、
Flex SDKを使ってコンパイルする際には、withを使ってのブロックスコープが実現されません。
FlashPlayerのせいでもなさそうですし、おそらくはコンパイル時のSDKの実装によるものだと思います。

ちなみにSDKのバージョンはVersion 3.1.0 build 2710です。
普段はSDKをメインに開発してるので結局はfuncionを使っての方法でやるしかなさそう。。。

FlashDevelopも確かSDKのはずだからできないのかな??
windowsないんで試せる人いたら教えてほしーっす。
テンションあがったのになぁー