Flash AS3按值传递参数
我对以下代码有问题:Flash AS3按值传递参数,flash,actionscript-3,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.toStr
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);
}}
for(var i:Number=0;i这与是否“按值传递参数”无关。您声明的事件处理程序函数根本不将i
变量作为参数访问。这就是为什么i
的值不由for循环确定的原因
有几种方法可以处理这种情况。您可以创建一个扩展事件的新类,并在其中添加索引值
或者,您可以创建一个数组并使用所需的索引存储FaceLoader。然后通过在数组中查找匹配的索引,使用正确的索引调用LoadCara()。还有另一种方法可以实现
它并不总是可取的,但有时很方便……函数的内容属于函数,不要使用函数外部的变量。例如cara1
和cara2
,即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);
}
}
}
然后,当您不再需要事件侦听器时,请执行以下操作:
for (var i:Number = 0; i < numFaces; i++) {
fLoader.contentLoaderInfo.removeEventListener(Event.INIT, functionsLoadCara[i]);
}
for(变量i:Number=0;i
这种传递参数的方法更安全。在中的示例更好
for (var i:Number = 0; i < numFaces; i++) {
fLoader.contentLoaderInfo.removeEventListener(Event.INIT, functionsLoadCara[i]);
}