actionscirptで変数のブロックスコープを実現する
昔に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ないんで試せる人いたら教えてほしーっす。
テンションあがったのになぁー