AS3按值传递参数

时间:2010-05-06 21:04:42

标签: flash actionscript-3

我遇到以下代码问题:

for (var i:Number=0; i<numFaces;i++){
    var faceLoader:Loader = new Loader();
    faceLoader.contentLoaderInfo.addEventListener( Event.INIT, 
    function(fle:Event){
        LoadCara(i,faceLoader);
        trace("LoadCara:" + i.toString());
    } );
}

function LoadCara(index:int,loader:Loader){
  if(index == 0)
  {
    trace("cara1:" + index.toString());
    cara1.removeChildAt(0);
    cara1.addChild(loader);
  }
  else if(index == 1)
  {
    cara2.removeChildAt(0);
    cara2.addChild(loader);
  }}

问题是我在每次迭代时将变量i发送到函数LoadCara,并且总是使用i的最后一个值调用它。我希望使用适当的索引调用此函数。

希望我提前解释自己。

3 个答案:

答案 0 :(得分:1)

函数的内容属于函数,不要使用外部的变量。与cara1cara2一样,i不属于您正在使用它的功能。

但修复代码很简单:

for (var i:Number = 0; i < numFaces; i++) {
  var fLoader:Loader = new Loader();
  fLoader.contentLoaderInfo.addEventListener(Event.INIT, LoadCara(i, fLoader));
  trace("LoadCara:" + i.toString());
}

function LoadCara(index:int, loader:Loader):Function {
  return function(fle:Event):void {
    if (index == 0) {
      trace("cara1:" + index.toString());
      cara1.removeChildAt(0);
      cara1.addChild(loader);
    } else if (index == 1) {
      cara2.removeChildAt(0);
      cara2.addChild(loader);
    }
  }
}

如果您希望以后能够使用removeEventListener(),请将循环调整为:

var functionsLoadCara:Object = new Object();
for (var i:Number = 0; i < numFaces; i++) {
  var fLoader:Loader = new Loader();
  functionsLoadCara[i] = LoadCara(i, fLoader);
  fLoader.contentLoaderInfo.addEventListener(Event.INIT, functionsLoadCara[i]);
  trace("LoadCara:" + i.toString());
}

然后,当您不再需要事件监听器时,请执行以下操作:

for (var i:Number = 0; i < numFaces; i++) {
 fLoader.contentLoaderInfo.removeEventListener(Event.INIT, functionsLoadCara[i]);
}

这种传递参数的方式更安全。它在this answer中得到了更好的证明。

答案 1 :(得分:0)

这与“按值传递参数”无关。您声明的事件处理函数根本不会将i变量作为参数访问。这就是为什么i的值不是由for循环决定的。

有几种方法可以解决这种情况。您可以创建一个扩展Event的新类,并在那里添加索引值。

或者您可以创建一个数组并使用您需要的索引存储faceLoaders。然后通过查找数组中的匹配索引,使用正确的索引调用LoadCara()。

答案 2 :(得分:0)

还有另一种方法可以实现what you want 它并不总是可取但有时也很方便......