AS3在函数内的root中创建变量

时间:2013-10-07 10:48:07

标签: actionscript-3 flash variables reload reset

我现在有一个相当大的swf,已经有一点编码了。大多数变量是在根目录中创建的,但现在我遇到了问题。

我想重新加载flash swf(重置),为此,我需要创建一个破坏所有变量的函数和另一个创建变量的变量。目前,我有一个重新加载页面的javascript函数,但这确实不是一个好的解决方案。

问题在于,当我在函数内部创建一个var时,它不会在" MovieClip(root)"中创建,而只是与函数相关,从而渲染我的函数瑞士法郎无法工作。

有没有办法在函数中创建MovieClip(root)中的变量?或者我可以选择做什么?

编辑:添加了一些示例代码。

function SetVar():void{
var test:String= new String("foobar");
}

SetVar();

trace(test);

...输出为:

Scene 1, Layer 'Layer 1', Frame 1, Line 7   1120: Access of undefined property test.

这是正常的,因为" var test"不是全局的,所以当函数结束时它就丢失了。我想让它成为函数" SetVar()"将变量添加到根或全局。

3 个答案:

答案 0 :(得分:3)

您需要了解范围的工作原理。

基本上:

  1. 在另一个对象(无论是类,函数,对象还是循环)中声明的对象仅在该特定对象或循环迭代中可用。
  2. 对象范围由子节点继承,而不是父节点继承。因此,类中的函数可以访问在该类中声明的对象,但是类不能访问函数中声明的对象
  3. 父(或任何其他对象)可以访问子类中声明的对象,但仅限于public对象
  4. 所以看看这些基本规则(它们非常非常基础。如果你刚刚开始,我敦促你对OOP中的对象范围做一些适当的研究。这是你将在几十个中做的一切的基础您正在声明函数中的对象并尝试从该函数外部访问它。这打破了上面的规则#1。

    相反,试试这个:

    var test:String;
    function setVar():void{
        this.test = 'foorBar';
    }
    
    trace(test); //output: null (undeclared)
    
    setVar();
    
    trace(this.test); // output: fooBar
    

    看着这个,我做了两件事:

    1. 我将test的声明移到了全局空间,这意味着该对象中的任何对象都可以访问它
    2. 我将SetVar重命名为setVar。这与您的问题无关,但在AS3中,标准命名约定规定您对所有对象(包括函数)使用lowerCaseCamelCase,对所有类名使用UpperCaseCamelCase,对所有包名使用lowercasename。再次,无关,但学习很好。
    3. 现在,理想情况下,您可能希望以稍微不同的方式执行setVar功能。为了允许更好的抽象(基本上使您的代码尽可能可以重用),您可能希望从函数返回值而不是在函数中手动设置变量。

      var test:String;
      var anotherTest:String;
      function setVar():String {
          return 'foorBar';
      }
      
      this.text = setVar();
      this.anotherTest = setVar();    
      
      trace(this.test); // output: fooBar
      trace(this.anotherTest); // output: fooBar
      

      因此,您可以将该函数与任何可以想象的String变量一起使用。显然,这在这里不是很有用,因为它没有做任何逻辑。但我相信你可以看到如何通过更多代码扩展它以使其更具动态性和更有用

      编辑:作为事后的想法,我使用了this关键字。在AS3(以及一些其他语言)中,this指的是当前类的范围(或者在时间轴帧编码的情况下是当前帧)。因此this.test引用在框架或类的范围内声明的变量test

答案 1 :(得分:0)

我不完全确定您要找的是什么,因为没有与您的问题相关的代码。但是,我会传达一些与该主题有关的信息。

如果在类中声明变量,那么可以从函数中引用它们:

package{
    import flash.display.MovieClip;

    public class DocumentClass extends MovieClip{

        public var example:String = 'dog';

        public function DocumentClass(){
            trace(example); // dog
            testFctn();
            trace(example); // frog
        }

        public function testFctn(){
            example = 'frog'
        }
    }
}

如果要引用父类this.parent['variableName']的变量也很有用。或者你的工人阶级的兄弟姐妹共享一个父类,this.parent['childClass']['variableName'] ......

答案 2 :(得分:0)

由于您在函数中声明变量,因此其范围仅限于该函数。

尝试在函数外声明变量并在函数中初始化它。 然后,您应该能够从root访问它。

但是如果你想在函数中声明一个变量(非常不寻常的要求),那么你可以尝试:

document["variableName'] = value;

root["variableName'] = value;

在函数内部。