Como ya se ha sugerido, es posible retirar el cierre de la cadena de oyentes desde dentro del propio cierre. Esto se hace mediante el uso de arguments.callee:
myDispatcher.addEventListener("click", function(event:Event):void
{
IEventDispatcher(event.target).removeEventListener(event.type, arguments.callee);
// Whatever else needs doing goes here
});
Esto a su vez de manera efectiva el cierre en un oyente de una sola vez del evento, sólo tiene que desprenderse una vez que el evento ha disparado. Aunque es sintácticamente detallado, es una técnica increíblemente útil para los muchos eventos que realmente solo se disparan una vez (o que solo te importan una vez) como "creationComplete" en Flex, por ejemplo. Utilizo esto todo el tiempo cuando descargo datos, ya que creo que tener el código de devolución de llamada en línea hace que sea más fácil de entender. Es como esconder la distancia asíncrono-dad:
myLoader.addEventListener("complete", function(event:Event):void
{
/* Even though the load is asynchronous, having the callback code inline
* like this instead of scattered around makes it easier to understand,
* in my opinion. */
});
Sin embargo, si desea escuchar los eventos en múltiples ocasiones, esto no va a ser muy eficaz por razones obvias. En ese caso, debe almacenar una referencia al cierre en alguna parte. Los métodos son objetos como cualquier otra cosa en ActionScript y se pueden pasar. Por lo tanto, podemos modificar nuestro código para tener este aspecto:
var closure:Function;
myDispatcher.addEventListener("click", function(event:Event):void
{
closure = arguments.callee;
// Whatever else needs doing goes here
});
Cuando tenga que quitar el detector de eventos, utilice la referencia de 'cierre', así:
myDispatcher.removeEventListener("click", closure);
Obviamente, esta es una ejemplo abstracto, pero usar cierres como este puede ser bastante útil. Sin embargo, tienen inconvenientes, como ser menos eficientes que los métodos nombrados. Otro inconveniente es el hecho de que en realidad tiene que almacenar una referencia al cierre si alguna vez lo necesita. Se debe tener cuidado para preservar la integridad de esa referencia, al igual que con cualquier otra variable.
Por lo tanto, aunque la sintaxis diferente puede tener sus usos, no siempre es la mejor solución. Es un tipo de cosas de manzanas y naranjas.
¿Por qué no usa weakReference? –