2010-12-25 11 views
10

Voglio fare in loop set di pulsanti e aggiungere ad essi alcuni eventi, ma le funzioni anonime sono le stesse. Scrivo codice di esempio:Creazione di funzioni anonime in loop con non gli stessi argomenti

for(var i:int=0;i<5;i++) 
{ 
    var button:SimpleButton = new SimpleButton(...); 
    ... 
    button.addEventListener(MouseEvent.CLICK, function(event:MouseEvent):void 
    { 
     trace(i); 
    }); 
} 

... 

E voglio tracciare 0,1,2,3 .. da pulsanti click invece di 4,4,4,4 .. Sai come posso fare questo?

+0

vedere anche http://stackoverflow.com/questions/422784/how-to-fix-closure-problem-in-actionscript-3-as3 –

risposta

19

Il problema che si sta verificando è che ActionScript non supporta le chiusure.

In altre parole, la variabile i non viene copiata nel proprio contesto per funzione. Tutte le funzioni si riferiscono alla stessa istanza di i.

Maggiori informazioni qui: http://flex.sys-con.com/node/309329

Per fare questo, è necessario una funzione che genera una funzione:

public function makeFunction(i:int):Function { 
    return function(event:MouseEvent):void { trace(i); } 
} 

Ora, si creano nuove istanze della funzione con il proprio contesto:

button.addEventListener(MouseEvent.CLICK, makeFunction(i)); 
Problemi correlati