关于我自己


关于我自己
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