2008-10-17 14 views
5

¿Por qué los cierres en línea se usan tan poco en Actionscript? Son muy poderosos y creo que son bastante legibles. Casi nunca veo a nadie usándolos así que tal vez estoy buscando el código equivocado. Google los usa en su API de Google Maps para muestras de Flash, pero creo que ese es el único lugar donde los he visto.Uso de cierres en línea/delegados de función en Actionscript

Los prefiero porque tienes acceso a las variables locales en el ámbito que los define y mantienes la lógica en un método y no terminas con muchas funciones para las cuales tienes que encontrar un nombre.

¿Hay alguna trampa de utilizarlos? Funcionan más o menos de la misma manera que en C#.

De hecho, acabo de descubrir que AS3 los admite, y estoy bastante molesto porque pensé que había leído que estaban obsoletos en AS #. ¡Así que estoy de vuelta a usarlos!

private function showPanel(index:int):void {  

_timer = new Timer(1000, 1);   
_timer.addEventListener(TimerEvent.TIMER, function(event:Event):void 
{ 
    // show the next panel 
    showPanel(index++); 
}); 

Respuesta

3

El mayor problema que debemos tener en cuenta es que a menudo 'esto' no está definido en el cierre en línea. A veces puede establecer un 'esto', pero no siempre es el correcto 'esto' que tendría que establecer, dependiendo de cómo los esté usando.

Pero yo diría que la mayor parte del código Flex en el que he trabajado ha tenido cierres en línea de manera desenfrenada en todo el código, ya que las devoluciones de llamadas son la única forma de hacer el trabajo y, a menudo, no es necesario una función separada por completo

A veces, cuando la función anidada está llegando a ser demasiado, la separaré ligeramente con variables de función en la función; esto me ayuda a organizar un poco al darles etiquetas a las funciones pero manteniendo algunas de las características de los cierres en línea (acceso a las variables locales, por ejemplo).

Espero que esto ayude.

1

encontré lo originalmente me hizo no quería hacer esto, pero me habían olvidado los detalles:

http://livedocs.adobe.com/flex/3/html/16_Event_handling_6.html#119539

(Esto es lo que se menciona Mitch - por lo que el 'esto' palabra clave estar fuera de alcance)

Así que esa es la respuesta de Adobe, sin embargo, es mucho más probable que necesite referirme a las variables locales que 'esto'.

¿Cómo interpretan los demás las recomendaciones de Adobe?

2

Un problema adicional es que la recolección de basura se rompe cuando se trata de cierres (al menos en Flash 9). La primera instancia de un cierre dado (desde un punto de vista léxico) nunca será recogida de basura, junto con cualquier otra cosa mencionada por el cierre en la cadena de alcance.