0

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

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

问题是,当我在函数中创建 var 时,它不会在“MovieClip(root)”中创建,而是仅与函数相关,从而使我的 swf 无法工作。

有没有办法在函数内创建 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()”将变量添加到根或全局。

4

3 回答 3

3

您需要阅读范围的工作原理。

基本上:

  1. 在另一个对象(无论是类、函数、对象还是循环)中声明的对象仅在该特定对象或循环迭代中可用。
  2. 对象范围由子代继承,而不是由父代继承。因此,类中的函数可以访问该类中声明的对象,但类不能访问函数中声明的对象
  3. 父类(或任何其他对象)可以访问在子类中声明的对象,但前提是它是一个public对象

所以看看那些基本规则(它们非常非常基本。如果你刚刚开始,我敦促你对 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. 我重命名SetVarsetVar. 这与您的问题无关,但在 AS3 中,标准命名约定要求您对所有对象(包括函数)使用 lowerCaseCamelCase,对所有类名使用 UpperCaseCamelCase,对所有包名使用小写字母。同样,不相关,但很好学。

现在,理想情况下,您可能希望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在框架或类的范围内声明的变量。

于 2013-10-07T16:09:29.510 回答
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']...

于 2013-10-07T11:30:50.233 回答
0

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

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

但是,如果您希望从函数中在根上声明一个变量(非常不寻常的要求),那么您可以尝试这样做:

document["variableName'] = value;

或者

root["variableName'] = value;

函数内部。

于 2013-10-07T13:14:01.083 回答