AS3 技巧- 利用internal namespace 动态存取scope chain 的区域变数

众所皆知,Java script 是可以利用eval 动态存取scope chain 的区域变数
如下所示:

  1. var obj = {};
  2. (function(obj) {
  3. var var3 = "Varia ble 3";
  4. (function(obj) {
  5.   var var2 = "Variable 2";
  6.   (function(obj) {
  7.    var var1 = "Variable 1";
  8.    obj.getVar = function(varName) {
  9.     return eval(varName);
  10.    }
  11.    obj.setVar = function(varName, value) {
  12.     return eval(varName + "=value");
  13.    }
  14.   })(obj);
  15. })(obj);
  16. })(obj);

  17. console.log(obj.getVar("var2")); // Variable 2
  18. obj.setVar("var2", {id: 123})
  19. console.log(obj.getVar("var2").id); // 123
复制代码

ActionScript 3.0 改版之后拿掉了eval 功能
难道因为这样就无法动态评估存取区域变数了吗?

之前我也是这样想的
不过最近再次看到 scope chain 相关文章
结合过去所学过的 AS3 namespace 语法
忽然有了其它的想法,于是开始动手测试~

测试后又有了新的发现
原来我们『可以利用internal namespace 动态存取scope chain 的区域变数! 』

AS3 语法内建的namespace 主要有AS3、public、protected、private、internal ...等
ActionScript language and syntax - Packages and namespaces
ActionScript 语言和语法- 套件和命名空间

关键就是在 internal namespace 上
文件 上写的是可以存取package 层级的名称空间
但是其实还能用来存取scope chain 的区域变数

以下是一个简单的 Demo:

  1. package {
  2. /**
  3.   * 透过internal 名称空间动态存取scope variable
  4.   */
  5. import flash .display.Sprite;

  6. [SWF(width="300", height="200")]
  7. public class ScopeTest01 extends Sprite {
  8.   
  9.   public function ScopeTest01() {

  10.    var obj:Object = {};
  11.    (function(obj:Object):void{
  12.     var var1:String = "Variable 1";
  13.     var var2:String = "Variable 2";
  14.    
  15.     obj.getVar = function (name:String):*{
  16.      return internal::[name];
  17.     };
  18.     obj.setVar = function (name:String, value:*):*{
  19.      return internal::[name] = value;
  20.     };
  21.    })(obj);
  22.    
  23.    trace(obj.getVar("var1")); // Variable 1
  24.    obj.setVar("var1", "Hello");
  25.    trace(obj.getVar("var1")); // Hello
  26.   }
  27. }
  28. }
  29. // Ticore's Blog - http://ticore.blogspot.com/
复制代码

很神奇吧!
AS3 拿掉eval 之后损失的动态评估能力,又靠着internal namespace 巧妙的找回来了

AS3 利用with, Proxy 选择性替换Scope Variables
ActionScript "with" Block Scope 遮蔽效应
ActionScript 3.0 - Function Closure
AS 3.0 利用匿名函式模拟多层 Block Scope

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值