Flex作用域
了解程序作用域
当程序中牵涉到加载外部.swf程序时,了解程序作用域的概念是非常重要的。
首先要了解所有的Flex/Flash程序都是由一系列类组合而成。这一系列类都维持在一个程序作用域中。当仅有一个程序在运行时,程序作用域的概念只是一个形式,因为不可能发生作用域冲突的事情。当加载额外的.swf程序后,情况就不一样了,此时,可能会发生3种情况:
被加载的.swf在现有作用域的子作用域中运行
这种情况下,被加载.swf可以使用父作用域中的所有类,而本身作用域中和父作用域中冲突的类,将被忽视。
这样子有3个好处:
减少内存的占用。
单态管理者(Singleton manager classes)可以访问父级程序,也可以访问子级程序。
从技术角度讲,在编译子级程序时,可以不用把重复的类编译进去,从而减少文件大小
但有时不能忽视子作用域的类。比如碰到类名虽然冲突,但功能却不相同时。
被加载的.swf在一个新的完全独立的作用域中运行
这种情况下,被加载.swf在一个不受任何约束的作用域中运行。虽然不会发生什么冲突,但这样会加大内存的占用。
被加载的.swf在现有作用域中运行
这种情况下,被加载.swf在现有的作用域中运行,被看作现有内容的一部分。常常用于运行期共享库。
实现上述3种情况的代码如下:
//------------------------------------------------------------
// 被加载的.swf在现有作用域的子作用域中运行
//------------------------------------------------------------
var context:LoaderContext = new LoaderContext();
context.applicationDomain = new ApplicationDomain(ApplicationDomain.currentDomain);
var request:URLRequest = new URLRequest("RuntimeLoadingExample.swf");
var loader:Loader = new Loader();
loader.load(request, context);
// 等同于
var request:URLRequest = new URLRequest("RuntimeLoadingExample.swf");
var loader:Loader = new Loader();
loader.load(request);
//------------------------------------------------------------
// 被加载的.swf在一个新的完全独立的作用域中运行
//------------------------------------------------------------
var context:LoaderContext = new LoaderContext();
context.applicationDomain = new ApplicationDomain();
var request:URLRequest = new URLRequest("RuntimeLoadingExample.swf");
var loader:Loader = new Loader();
loader.load(request, context);
//------------------------------------------------------------
// 被加载的.swf在现有作用域中运行
//------------------------------------------------------------
var context:LoaderContext = new LoaderContext();
context.applicationDomain = ApplicationDomain.currentDomain;
var request:URLRequest = new URLRequest("RuntimeLoadingExample.swf");
var loader:Loader = new Loader();
loader.load(request, context);