2008-10-17 7 views
5

Pourquoi les fermetures en ligne sont-elles si rarement utilisées dans Actionscript? Ils sont très puissants et je pense que c'est assez lisible. Je ne vois presque personne qui les utilise alors peut-être que je regarde juste le mauvais code. Google les utilise dans leur API Google Maps pour les échantillons Flash, mais je pense que c'est le seul endroit où je les ai vus. Je les préfère parce que vous avez accès aux variables locales dans la portée qui les définit et vous gardez la logique dans une méthode et ne vous retrouverez pas avec beaucoup de fonctions pour lesquelles vous devez trouver un nom.Utilisation des fermetures en ligne/délégués de fonction dans Actionscript

Y at-il des prises de les utiliser? Est-ce qu'ils fonctionnent à peu près de la même manière qu'en C#?

En fait, je ne viens de découvrir que AS3 les soutient, et je suis tout à fait ennuyé becasue Je pensais que je l'ai lu qu'ils étaient déconseillés dans AS #. Donc je suis de retour à les utiliser!

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

Répondre

3

Le plus grand Gotcha à surveiller est que, souvent, «ce n'est pas définie dans la fermeture en ligne. Parfois, vous pouvez définir un 'ceci', mais ce n'est pas toujours le bon 'ceci' que vous auriez à définir, selon la façon dont vous les utilisez. Mais je dirais que la plupart des codes Flex sur lesquels j'ai travaillé comportaient des fermetures en ligne dans le code, car les rappels sont la seule façon de faire le travail, et souvent vous n'avez pas besoin de les faire ressortir. une fonction entière séparée.

Parfois, quand la fonction imbriquée devient trop bien, je vais le casser légèrement avec des variables de fonction dans la fonction; cela m'aide à organiser un peu en donnant des étiquettes aux fonctions mais en gardant certaines des caractéristiques des fermetures en ligne (accès aux variables locales, par exemple).

Espérons que cela aide.

1

J'ai trouvé ce que l'origine m'a donné envie de ne pas faire cela, mais je l'avais oublié les détails:

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

(C'est ce que Mitch a mentionné - pour autant que le mot-clé « ce » étant hors de champ d'application)

donc c'est la réponse d'Adobe, mais je suis beaucoup plus susceptibles d'avoir besoin de se référer à des variables locales que « ceci ».

Comment les autres interprètent la recommandation d'Adobe?

2

Un problème supplémentaire est que la collecte des ordures est cassé en matière de fermeture (au moins dans Flash 9). La première instance d'une fermeture donnée (d'un point de vue lexical) ne sera jamais ramassée - ainsi que toute autre chose référencée par la fermeture de la chaîne de portée.