0

“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   
    }

}
}

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

不,多维数组不能满足我的需要。虽然看起来它可以解决提供的代码片段中的所有问题,嗯?

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

4

3 回答 3

2

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

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

但更重要的是,我会仔细研究你正在尝试做的事情,并确定这是否是一个好方法——我敢打赌,它不是。看起来您可能想要考虑一个处理您要存储的所有数据的隔离类。

于 2012-06-04T02:26:20.357 回答
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]);
      }
  }
}

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

于 2012-06-04T02:39:54.783 回答
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);
       }
    }

}
于 2012-06-04T02:40:04.127 回答