Flash AS3 全局变量?

Posted

技术标签:

【中文标题】Flash AS3 全局变量?【英文标题】:Flash AS3 Global Variables? 【发布时间】:2010-12-23 13:12:45 【问题描述】:

嗨,我有一个主课

//main.as

package 
    public class main 
        public var testGlobal:string = "testValue";

    



//pop.as

package 
    public class pop 
        function pop():void 
            trace("testGloabl from main.as" + testGlobal);
        
    

如何使用主类对象获取 pop.as 宽度上的 testGlobal 值。 有没有全局变量的方法??

如何在 AS3 中使用全局变量。

【问题讨论】:

嘿,我们的答案都不让您满意吗? Amarghosh 的回答和我自己的回答几乎涵盖了您可能需要的所有内容。至少其中一个应该被视为答案。 是的,你应该接受@alecmce 的回答——这是技术上正确回答“有没有全局变量的方法?” 【参考方案1】:

testGlobal 不是全局变量,它是Main 类的公共实例变量。不使用Main 类对象就无法访问它,因为没有对象就没有属性。实例变量与对象相关联。

如果您要访问创建一个不绑定到任何特定对象实例的属性,请将其声明为static

//Main.as
package 
    public class Main 
        public static var testGlobal:string = "testValue";
    



//Pop.as
package 
    public class Pop 
        function pop():void 
                trace("testGloabl from Main.as" + Main.testGlobal);
        
    

【讨论】:

好的我知道,但我想要一个全局变量来设置一个类的值并从不同的类获取或访问..这怎么可能?? 您可以从任何类获取/设置公共静态变量Main.testGlobal 那么如何在 as3 中设置全局变量 如果 set 你的意思是修改值,这就是你的做法Main.testGlobal = "some other value" - 如果你在寻找全局变量,同样,创建一个变量public static 是要走的路。 如何在 AS3 中创建全局变量,AS3 是否支持像 AS2 中一样的全局变量??【参考方案2】:

如果您绝对必须在 as3 中有一个全局变量,您可以随时在源文件夹的顶层创建一个文件,如下所示:

MULTIPLIER.as

package

    public var MULTIPLIER:int = 3;

然后,当您需要乘数时,您可以像这样在任何需要的地方引用它:

DoSomeMultiplying.as

package multiplying

    public class DoSomeMultiplying
    
        public function multiplyMe(n:int):int
        
            var m:int = n * MULTIPLIER;
            MULTIPLIER = m;
            return m;
        
    

但是,我强烈建议您不要这样做!这是非常糟糕的做法,非常缓慢,而且,只是可怕!

但是,可以在默认包中创建一个全局变量或常量来充当全局常量或变量。

在 AS3 中声明全局函数

注意,同样的方法也可以创建全局函数,不需要使用import语句for(类似于内置的trace函数):

问候.as

package 
  public function greet():String  return "Hello World" 

与全局变量类似,这个全局函数可以从任何地方访问,无需导入语句:

package bar 
    public class foo
    
        public function foo():void
        
            trace("New foo says: "+greet()+", no import necessary");
            // New foo says: Hello World, no import necessary
        
    

【讨论】:

我同意 alecmce 这是一种可怕的做法! 如果有人想知道,这是一个可怕的做法的原因是因为其他地方的另一个变量可能具有相同的名称。然后您将无法从那里访问全局变量(另一个变量所在的范围),因为它会覆盖全局变量。 谢谢。我想要一个可以快速使用的全局调试功能,而不必添加导入语句(基本上就像trace),这确实是解决方案(尽管在我的情况下,它是public function()而不是public var)当然,您不想以这种方式构建代码,但在某些情况下很高兴知道。为确保这些功能不包含在生产构建中,您可以将它们放在单独的 -source-path 中并相应地更新您的构建脚本。【参考方案3】:

您可以像之前所说的那样使用静态模式,也可以使用单例模式。 AS中没有私有构造函数,所以你可以做的是: a) 非常小心不要调用构造函数 b) 每次有人调用构造函数并且实例已经设置时发送一个异常。

我不认为有实际的全局变量——但我不明白你为什么需要任何变量。如果您希望类中的变量可以从外部修改,只需将其声明为静态,然后执行 className.variableName = .

【讨论】:

@webdreamer,是的,如果你必须拥有它们的话。我推荐你看我的帖子,你似乎忽略了! 好吧我说我不认为有...那是因为我不确定...我想做的只是将单例模式称为有时使用的模式规避使用全局变量的问题......我不记得这是哪一天(10天前!)虽然我记得你的回答。我可能只是在发布我的帖子后才注意到它。【参考方案4】:

我同意其他人刚才所说的,避免全局变量,更喜欢常量(通常常量不是要更改的)

【讨论】:

【参考方案5】:
//main.as

package 
    public class main 
        public var testGlobal:string = "testValue";

    



//pop.as

package 

public class pop 
    function pop():void 
        trace("testGlobal from main.as -- " + new main().testGlobal);
        // or
        var m : main = new main();
        trace(m.testGlobal);
    

【讨论】:

【参考方案6】:

只需从您想要调用主时间线的任何级别执行此操作:

//Define your global variable
var myGlobalVariable:String = "Get Up!";
//call it from anywhere
var Root:MovieClip = root as MovieClip;
trace(Root.myGlobalVar);

这应该随时可用。

【讨论】:

【参考方案7】:

只需从您想要调用主时间线的任何级别执行此操作:

//Define your global variable
var myGlobalVariable:String = "Get Up!";
//call it from anywhere var Root:MovieClip = root as MovieClip;
trace(Root.myGlobalVar);

这应该随时可用。

var i:int = 10000000;
while(i--)
    Root.nn--;

比以下慢 23 倍:

var i:int = 10000000;
while(i--)
    globalVar.nn--;  // package

【讨论】:

【参考方案8】:

您可以使用 _global 关键字...

ex : 一个名为“_global.as”的文件,代码如下:

public var _global:* = activateGlobals();

public function activateGlobals():*
    if(_global == null)
        _global = this;
    
    return _global;

然后你可以在一个类中测试_global,例如“Main2.as”(玩得开心):

package classes 
import flash.display.Sprite;
public class Main2 extends flash.display.Sprite
    include "_global.as";
    var globalMethod:Function;
    var globalID;
    var globalValue:Number;
    var innerMethod:Function;
    var factorial:Function;
    var prototype = Main2.prototype;
    Main2.prototype.globalID = "globalIDprototype";
    Main2.prototype.globalValue = Math.PI*2;
    public function Main2() 
        _global.factorial = function(n:Number)  
            if (n<=1)  
                return 1; 
             else  
                return n*_global.factorial(n-1); 
             
         
        prototype.setPropertyIsEnumerable("globalID",true);
        _global.globalMethod = function()
            trace("Use of the _global method \"globalMethod()\"");
        
        _global.globalID = "_global id";
        _global.globalValue = Math.PI;
        _global.globalMethod();
        // access properties :
        trace(_global.globalID);
        trace(_global.globalValue);
        trace(prototype.globalID);
        trace(prototype.globalValue);
        listValues();
        getNameInInnerMethod();
        _global.globalMethod();
        getNameInInnerMethod();
    

    private function listValues():void
        for(var i in prototype)
            trace(" - prototype[" + i + "] = " + prototype[i]);
        
        for(i in _global)
            trace(" - _global[" + i + "] = " + _global[i]);
        
        i = null; // optionnal
    
    private function getNameInInnerMethod():void
        _global.globalMethod = function()
            trace("this.name = " + this.name);
            trace("_global.name = " + _global.name);
        
        function innerMethod():void
            trace("this.name = " + this.name);
            trace("_global.name = " + _global.name);
            // with global you have access to the name property from the inner method.
        
        innerMethod();
    


【讨论】:

【参考方案9】:

也许你可以将var testGlobal:string = "testValue"; 放在第一帧

【讨论】:

以上是关于Flash AS3 全局变量?的主要内容,如果未能解决你的问题,请参考以下文章

Flash AS3全局安全设置 - 以编程方式

如何在 Flash AS3 中从 URL 获取/获取变量

as3 重用具有不同变量的 datagrid cellrenderer

无法访问 Flash as3 中的阶段

来自 Textinput 的 Flash as3 比较

2.C语言------程序运行为什么需要内存2