2010-12-25 26 views
10

Quiero hacer un conjunto de botones en bucle y agregarles algunos eventos, pero las funciones anónimas son las mismas. Escribo ejemplo de código:Creación de funciones anónimas en bucle sin los mismos argumentos

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

... 

Y quiero trazar 0,1,2,3 .. de botones que se encuentran en lugar de 4,4,4,4 .. ¿Usted sabe cómo puedo hacer esto?

+0

véase también http://stackoverflow.com/questions/422784/how-to-fix-closure-problem-in-actionscript-3-as3 –

Respuesta

19

El problema con el que se está encontrando es que ActionScript no admite cierres.

En otras palabras, la variable i no se copia en su propio contexto por función. Todas las funciones se refieren a la misma instancia de i.

Más información aquí: http://flex.sys-con.com/node/309329

Para ello, se necesita una función que genera una función:

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

Ahora, crear nuevas instancias de la función con su propio contexto:

button.addEventListener(MouseEvent.CLICK, makeFunction(i)); 
Cuestiones relacionadas