答案 0 :(得分:8)
已经有几个好的答案。我只想指出YOU CAN
在AS3中创建全局变量。只需创建一个文件,例如,在类文件夹的根目录中的MyGlobal.as:
package {
public var MyGlobal:String = "bla";
}
您可以MyGlobal
访问它,因为它位于最顶层的包中。这种技术可以用于几种不那么具有破坏性的方式。例如,你可以有一个类似于单例的全局常量,但它不是静态的,而只是某个类的实例:
package {
public const MySingleton:IMySingleton = new MySingletonImpl();
}
更新;不是来自原始海报 我之前从未听说过这个,所以我整理了一个快速的样本:
在根目录中:
package
{
public var MyGlobal:String = "bla";
}
测试类:
package com.flextras.stackOverflow
{
public class MyGlobalTest
{
public function MyGlobalTest()
{
trace(MyGlobal);
}
}
}
测试应用程序:
<?xml version="1.0" encoding="utf-8"?>
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx" initialize="windowedapplication1_initializeHandler(event)">
<fx:Script>
<![CDATA[
import com.flextras.stackOverflow.MyGlobalTest;
import mx.events.FlexEvent;
protected function windowedapplication1_initializeHandler(event:FlexEvent):void
{
trace(MyGlobal);
var a :MyGlobalTest = new MyGlobalTest();
}
]]>
</fx:Script>
<fx:Declarations>
<!-- Place non-visual elements (e.g., services, value objects) here -->
</fx:Declarations>
</s:WindowedApplication>
运行应用程序,跟踪确实会显示两次正确的'bla'值。
答案 1 :(得分:4)
as3中没有全局变量。但是可以在不创建类的实例的情况下访问静态变量,因此它们可以用作全局变量。
package
{
class MyClass
{
// ...
public static var myStaticVar: Number;
// ...
}
}
然后在程序中的任何位置,您都可以访问变量myStaticVar,如下所示:
MyClass.myStaticVar = 5;
// ...
var value:Number = MyClass.myStaticVar;
答案 2 :(得分:3)
全球到底是什么?
如果你想申报一个&#34; global&#34;上课;你可以使用任何变量:
public var myClassGlobal : Object = new Object();
这个变量可以在类中的任何地方访问;因为我公开了它,所以任何可以访问该类实例的类都可以使用它。您可以这样访问它:
trace(myClassInstance.myClassGlobal);
如果你想申报一个&#34; global&#34;对于Flex应用程序,您可以在主应用程序文件中声明一个变量:
public var myFlexApplicationGlobal :Object = new Object():
您可以使用FlexGlobals.topLevelApplication在代码中的任意位置访问此值。像这样:
trace((FlexGlobals.topLevelApplication as myMainApplicationFile).myFlexApplicationGlobal);
这样的方法通常被认为是封装禁忌;因为它为您的类提供了对主应用程序文件的依赖,并最大限度地减少了重用。这通常是我们试图避免的。
您可以使用该类创建静态变量并在任何位置访问它。静态变量不依赖于类的实例:
public static var myStaticGlobal :Object = new Object():
您可以像这样访问它:
trace(MyClassWithStaticVariable.myStaticGlobal);
您还可以使用全局变量创建Singleton类,并使用框架(如Swiz或RobotLegs)将该类注入需要它的类中。快速谷歌搜索应该向您显示有关在Flex中创建Singletons的信息;在更大的编程社区范围内,有很多关于单身人士的讨论和反对。
答案 3 :(得分:0)
package com.appcloud9.utils
{
public class GlobalReference
{
public static function get global() : Object
{
var getGlobal : Function = function() : Object
{
return this;
};
return getGlobal();
}
}
}
/*-|-||-|-||-|-||- usage examples -||-|-||-|-||-
* the examples below focus on giving global access to the main Stage instance
* but anything added to the global object ( which always exists no matter what )
* is accessible via the same mechanisms
*/
// global stage reference added in main document class upon Event.EXIT_FRAME :
GlobalReference.global.stage = stage;
// later in a closure
var signalLightsOut = new Signal();
signalLightsOut.add( function() : void
{
/* because the [ object global ] truly is 'global' all closures have
* direct access to any properties added to it ( it is a dynamic class )
*/
trace( stage ); // [object Stage]
} );
// later in a constructor - before the class has a stage of it's own
public function MyConstructor()
{
trace( stage ); // null
trace( GlobalReference.global.stage ); // [object Stage]
}
答案 4 :(得分:0)
在方法结束中,关键字 this
会返回对“全局”对象的引用。
以下是从方法结束中的检查 this
时的一些有趣结果。
trace( this ); // outputs : [object global]
trace( flash.utils.describeType( this ) );
/* outputs :
description:
<type name="global" base="Object" isDynamic="true" isFinal="true" isStatic="false">
<extendsClass type="Object"/>
<constant name="Boolean" type="Boolean"/>
<constant name="Namespace" type="Namespace"/>
<constant name="undefined" type="*"/>
<constant name="Number" type="Number"/>
<constant name="USE_ITRAITS" type="uint" uri="avmplus"/>
<constant name="Vector" type="__AS3__.vec::Vector" uri="__AS3__.vec"/>
<constant name="uint" type="uint"/>
<constant name="Infinity" type="Number"/>
<constant name="int" type="int"/>
<constant name="String" type="String"/>
<constant name="Object" type="Object"/>
<constant name="HIDE_NSURI_METHODS" type="uint" uri="avmplus"/>
<constant name="INCLUDE_BASES" type="uint" uri="avmplus"/>
<constant name="Array" type="Array"/>
<constant name="INCLUDE_VARIABLES" type="uint" uri="avmplus"/>
<constant name="INCLUDE_ACCESSORS" type="uint" uri="avmplus"/>
<constant name="INCLUDE_INTERFACES" type="uint" uri="avmplus"/>
<constant name="INCLUDE_METHODS" type="uint" uri="avmplus"/>
<constant name="INCLUDE_METADATA" type="uint" uri="avmplus"/>
<constant name="INCLUDE_CONSTRUCTOR" type="uint" uri="avmplus"/>
<constant name="INCLUDE_TRAITS" type="uint" uri="avmplus"/>
<constant name="Class" type="Class"/>
<constant name="HIDE_OBJECT" type="uint" uri="avmplus"/>
<constant name="FLASH10_FLAGS" type="uint" uri="avmplus"/>
<constant name="AS3" type="*"/>
<constant name="Function" type="Function"/>
<constant name="NaN" type="Number"/>
<method name="parseInt" declaredBy="global" returnType="Number">
<parameter index="1" type="String" optional="true"/>
<parameter index="2" type="int" optional="true"/>
</method>
<method name="parseFloat" declaredBy="global" returnType="Number">
<parameter index="1" type="String" optional="true"/>
</method>
<method name="escape" declaredBy="global" returnType="String">
<parameter index="1" type="String" optional="true"/>
</method>
<method name="unescape" declaredBy="global" returnType="String">
<parameter index="1" type="String" optional="true"/>
</method>
<method name="isXMLName" declaredBy="global" returnType="Boolean">
<parameter index="1" type="*" optional="true"/>
</method>
<method name="describeType" declaredBy="global" returnType="XML" uri="avmplus">
<parameter index="1" type="*" optional="false"/>
<parameter index="2" type="uint" optional="false"/>
</method>
<method name="getQualifiedClassName" declaredBy="global" returnType="String" uri="avmplus">
<parameter index="1" type="*" optional="false"/>
</method>
<method name="getQualifiedSuperclassName" declaredBy="global" returnType="String" uri="avmplus">
<parameter index="1" type="*" optional="false"/>
</method>
<method name="decodeURI" declaredBy="global" returnType="String">
<parameter index="1" type="String" optional="true"/>
</method>
<method name="decodeURIComponent" declaredBy="global" returnType="String">
<parameter index="1" type="String" optional="true"/>
</method>
<method name="encodeURI" declaredBy="global" returnType="String">
<parameter index="1" type="String" optional="true"/>
</method>
<method name="encodeURIComponent" declaredBy="global" returnType="String">
<parameter index="1" type="String" optional="true"/>
</method>
<method name="isNaN" declaredBy="global" returnType="Boolean">
<parameter index="1" type="Number" optional="true"/>
</method>
<method name="isFinite" declaredBy="global" returnType="Boolean">
<parameter index="1" type="Number" optional="true"/>
</method>
</type>:
*/
description = flash.utils.describeType( Object( this ).constructor as Class );
trace( "description:\n" + description );
/* outputs :
<type name="Object" base="Class" isDynamic="true" isFinal="true" isStatic="true">
<extendsClass type="Class"/>
<extendsClass type="Object"/>
<constant name="length" type="int"/>
<accessor name="prototype" access="readonly" type="*" declaredBy="Class"/>
<factory type="Object"/>
</type>:
*/