2010-05-06 85 views
0

具有下面的代碼問題IM:AS3傳遞參數值

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); 
    }} 

的問題是,IM發送變量i功能LoadCara在每個迭代上,它總是與我的最後的值稱爲。我想用適當的索引來調用這個函數。

希望我解釋一下自己,在此先感謝。

回答

0

這不是關於「按值傳遞參數」還是沒有。您聲明的事件處理程序函數完全不會訪問i變量作爲參數。這就是爲什麼i的值不是由for循環決定的原因。

有幾種方法可以解決這種情況。您可以創建一個擴展事件的新類,並在其中添加索引值。

或者你可以創建一個數組並存儲你所需要的索引的faceLoaders。然後通過查找數組中匹配的索引,用正確的索引調用LoadCara()。

0

還有另一種方式來實現what you want 它並不總是可取的,但有時也很方便......

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中更好地體現了這一點。