如何在actionscript中声明一个全局变量

时间:2012-02-29 19:09:46

标签: actionscript-3 flex actionscript

我期待一些讽刺,但到底是什么。我搜索了actionscript参考页面,似乎无法找到如何声明简单的全局变量。

5 个答案:

答案 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>:
*/