actionscript 3.0错误1069“this”找不到函数外的声明变量

时间:2012-06-04 01:55:15

标签: actionscript-3

“this”无法找到合适的变量“array1”,尽管它在函数中明确声明。但是如果我在函数之外声明变量就可以了。如何在函数内部使用变量但保持其工作?

package 
{

public class main extends MovieClip
{
//If I declared the variables here it would work.
    public function main():void
    {
        var array1:Array = [1,2];
        var array2:Array = [3,4];
        trace(this["array"+1][1]); //returns reference error 1069   
    }

}
}

我是否坚持在函数之外声明变量?

不,多维数组不能满足我的需要。虽然看起来它会解决所提供的代码片段中的所有内容吗?

我的意图是通过要使用的类传递数组并更改我使用的数组。如果我使用多维数组,由于会发生复制,效率会很低。

3 个答案:

答案 0 :(得分:2)

this[]访问属性,这些属性必须属于this。在您的示例中,属性属于定义它们的函数,并且在该范围之外是不可访问的。

首先;是的,为了使您的代码工作,您当然需要在类级别范围内定义属性。

但更重要的是,我会仔细研究你要做的事情并确定它是否是一个好方法 - 我的赌注是它不是。您似乎可能想要考虑一个处理您要存储的所有数据的隔离类。

答案 1 :(得分:2)

您的错误是因为您误操作了变量 “this”关键字表示您尝试在类的特定实例上定位变量 您已将变量局部地限定在函数中 您需要将它们移动到类声明区域以使“this”起作用。

package 
  {

  public class main extends MovieClip
  {
         public var array1:Array = [1,2];
         public var array2:Array = [3,4];
      public function main():void
      {
          trace(this["array"+1][1]); //returns reference error 1069   
      }

  }
}




// now if you meant to scope them locally to the function then you can not use "this"
// you have to assign them to an object or an array 

package 
  {

  public class main extends MovieClip
  {
      public function main():void
      {
          var obj:Object = {}
              obj['array1'] = new Array( [1,2] )
              obj['array2'] = new Array( [3,4] )
          trace(obj["array"+1][1]);
      }
  }
}

这是未经测试的代码,但它应该让您走上正确的轨道。

答案 2 :(得分:0)

根据您要完全实现的目标,您还可以考虑将数组作为参数传递给函数,例如:

function main():void
{
    var array1:Array = [1,2];
    var array2:Array = [3,4];
    doSomethingWithArray(array2);
}
main();

function doSomethingWithArray(arr:Array):void
{
    trace(arr[1]); //Traces the value of array2[1], which = 4
}

另外考虑让var currentArray:Array设置为您想要的任何数组,并根据需要引用它(如果适用)。

public class main extends MovieClip
{

    ...
    public var currentArray:Array;

    function main():void
    {
        var array1:Array = [1,2];
        currentArray = array1;
        doSomethingithCurrentArray();

        var array2:Array = [3,4];
        currentArray = array2;
        doSomethingithCurrentArray();

        currentArray = null;
    }

    public function doSomethingithCurrentArray():void {
       if(currentArray != null){
          trace(currentArray);
       }
    }

}