关于我自己
关于我自己
2010年10月01日
上次介绍过 AS3 internal namespace 技巧
它是可以动态存取外层区域变数的
可是想要存取同一层 scope chain 却遇到问题 package { import flash.display.Sprite; public class ScopeTest extends Sprite { public function ScopeTest() { var var1:String = "Variable 1"; trace(internal::["var1"]); } } }
编译并执行以上的程式会拿到一个 Error
ReferenceError: Error #1081: global 上找不到属性 var1,且没有预设值。
假如加上 try...catch 捕捉例外,它又可以正常执行了!
可能 try...catch 也算是多一层 scope 吧
测试到后来,发现只要在该层随便加上 try...catch、function closure、with block
都能让 internal namespace 可以动态存取同一层的区域变数
以下是完整范例:
利用 try...catch 让 internal namespace 存取该层变数 package { import flash.display.Sprite; public class ScopeTest extends Sprite { public function ScopeTest() { var var1:String = "Variable 1"; var var2:String = "Variable 2"; var var3:String = "Variable 3"; trace(internal::["var" + int(Math.random() * 3 + 1)]); // Variable 1 - 3 try {} catch (e:*) {} } } }
利用 function closure 让 internal namespace 存取该层变数 package { import flash.display.Sprite; public class ScopeTest extends Sprite { public function ScopeTest() { var var1:String = "Variable 1"; var var2:String = "Variable 2"; var var3:String = "Variable 3"; trace(internal::["var" + int(Math.random() * 3 + 1)]); // Variable 1 - 3 (function():*{}); } } }
利用 with block 让 internal namespace 存取该层变数 package { import flash.display.Sprite; public class ScopeTest extends Sprite { public function ScopeTest() { var var1:String = "Variable 1"; var var2:String = "Variable 2"; var var3:String = "Variable 3"; trace(internal::["var" + int(Math.random() * 3 + 1)]); // Variable 1 - 3 with(0); } } }
相关连结:
AS3 技巧 - 利用 internal namespace 动态存取 scope chain 的区域变数
AS3 利用 with, Proxy 选择性替换 Scope Variables
ActionScript "with" Block Scope 遮蔽效应
ActionScript 3.0 - Function Closure
AS 3.0 利用匿名函式模拟多层 Block Scope
ActionScript 3 Namespace
转载请注明出处 http://ticore.blogspot.com/2010/10/as3-internal-na mespace-scope-chain.html
2 意见 :
Gene 提到...
原来try catch 和 with 也会让local变成trait,下次要小心用了,
猜你喜欢
转载自dw864dw.iteye.com/blog/1359599
今日推荐
周排行