Как объявить глобальную переменную в actionscript - PullRequest
0 голосов
/ 29 февраля 2012

Я ожидаю некоторого сарказма, но какого черта.Я искал справочную страницу Actionscript и не могу найти, как объявить простую глобальную переменную.

Ответы [ 5 ]

8 голосов
/ 29 февраля 2012

Уже есть несколько хороших ответов.Я просто хочу отметить, что YOU CAN создает глобальные переменные в AS3.Просто создайте файл, например, MyGlobal.as в корневом каталоге вашей папки классов:

package {
    public var MyGlobal:String = "bla";
}

И вы можете получить к нему доступ как MyGlobal, поскольку он находится в самом верхнем пакете.Эту технику можно использовать несколькими не столь разрушительными способами.Например, вы можете иметь глобальную константу, которая похожа на одноэлементную, но вместо того, чтобы быть статической, она будет просто экземпляром некоторого класса:

package {
    public const MySingleton:IMySingleton = new MySingletonImpl();
}

Update;не из оригинального плаката, о котором я раньше никогда не слышал, поэтому я собрал быстрый пример:

В корневом каталоге:

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'.

4 голосов
/ 29 февраля 2012

В as3 нет глобальных переменных.Но статические переменные могут быть доступны без создания экземпляра класса, поэтому они могут использоваться в качестве глобальных переменных.

package 
{
     class MyClass
     {
         // ...
         public static var myStaticVar: Number;
         // ...
     }
}

Затем в любом месте вашей программы вы можете получить доступ к переменной myStaticVar следующим образом:

MyClass.myStaticVar = 5;
// ...
var value:Number = MyClass.myStaticVar;
3 голосов
/ 29 февраля 2012

Глобальный к чему?

Если вы хотите объявить переменную, которая является «глобальной» для класса; Вы можете просто использовать любую переменную:

public var myClassGlobal : Object = new Object();

Эта переменная будет доступна в любом месте класса; и поскольку я сделал его общедоступным, он также доступен для любых классов, которые могут получить доступ к экземпляру этого класса. Вы бы получили к нему доступ так:

trace(myClassInstance.myClassGlobal);

Если вы хотите объявить переменную, которая является «глобальной» для приложения 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, для внедрения этого класса в классы, которые в нем нуждаются. Быстрый поиск в Google должен раскрыть вам информацию о создании Singletons во Flex; и есть много дискуссий за и против синглетонов в рамках большего сообщества программистов ..

0 голосов
/ 19 декабря 2012

Из закрытия метода ключевое слово 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>:
*/
0 голосов
/ 19 декабря 2012
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]
}
...