我遇到以下代码问题:
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的最后一个值调用它。我希望使用适当的索引调用此函数。
希望我提前解释自己。
答案 0 :(得分:1)
函数的内容属于函数,不要使用外部的变量。与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);
}
}
}
如果您希望以后能够使用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 它并不总是可取但有时也很方便......