【问题标题】:Flash AS3 Global Variables?Flash AS3 全局变量?
【发布时间】: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 的回答——这是技术上正确回答“有没有全局变量的方法?”

标签: flash actionscript-3 actionscript actionscript-2


【解决方案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"; 放在第一帧

            【讨论】:

              猜你喜欢
              • 2011-07-19
              • 1970-01-01
              • 2014-03-21
              • 1970-01-01
              • 2013-12-14
              • 1970-01-01
              • 1970-01-01
              • 2014-07-08
              • 1970-01-01
              相关资源
              最近更新 更多