Comment expliquez-vous les fermetures pour un enfant de 13 ans?

Vous cherchez une explication simple et concise des fermetures (programmation) et leur impact sur la qualité et le style de code.

Réponse

Disons que l’enfant de 13 ans joue un jeu de monopoly.  Il y a quatre joueurs et ils jouent jusqu'à ce qu’il y ait un gagnant, et puis le jeu est terminé.  Tout en jouant le jeu, il y a toutes sortes d’État dans le jeu y compris quelle place piece de chaque joueur, combien d’argent chaque joueur a, combien de maisons ou hôtels sont sur chaque propriété, combien d’argent est au milieu et ainsi de suite.  Jouer le jeu tout le monde peut voir et accéder à tous cet État.

En treize ans, quand le jeu est fini ils juste aller dans l’autre chambre et départ jouer autre chose - laissant le panneau en place.  Quand leur parent vient autour et voit que personne ne joue le jeu, qu’ils ramassent le jeu, mettre tous de retour dans la boîte et ranger le jeu dans le meuble.  L’état du jeu est essentiellement détruit comme on ne voit pas non plus comment le match s’est terminé, qui a gagné, où les pièces étaient, qui avait combien d’argent, etc....

Maintenant, permet d’apporter une modification.  Imaginons que nous avons des billets pour les gens à regarder le match.  Si un ami vient et dit qu’ils veulent regarder le match, vous leur donnez un billet et vous leur dites que tant qu’ils ont leur billet, ils peuvent venir regarder le Conseil à tout moment, même après que le jeu est terminé.  Mais, s’ils tourner dans leur billet ou détruisent leurs billets, puis ils ne peut-être pas en mesure de voir le jeu plus.  Quand tes parents s’agit pour voir que si vous avez terminé et voir si le jury doit Ranger, ils seront seulement ranger le jeu si le jeu est complet et s’il n’y a pas de billets Regarde un encore en usage.  Si tout Regarde un billet est encore en usage, alors ils vont laisse le Conseil, tout comme ils l’ont trouvé.

Alors... vous commencez une nouvelle partie.  Deux amis viennent à regarder et que vous émettez chacun un ticket.  Après un certain temps, un des amis doit quitter pour aller faire quelques devoirs, mais ils prennent leur billet avec eux.  Le jeu se termine, l’autre visionneuse tourne dans leur billet et tous les joueurs passer à autre chose.  Le parent vient autour de nettoyer, mais il voit qu’il subsiste un Regarde un billet en cours d’utilisation (même si cette personne ne se trouve pas actuellement) donc ils quittent le Conseil monopole comme si c’était.

Puis, quelques heures plus tard le spectateur qui reste à faire quelques recherches nous revient avec son billet, retire l’état final de la Commission et tourne dans leur billet.  Maintenant, la prochaine fois que le parent vient autour, ils voient que le jeu est fait et il y a pas plus de Regarde un billets en cours d’utilisation donc ils nettoient jusqu'à la chambre et tout ranger.

Dans cet exemple, l’état du jeu monopoly est comme l’état d’une fonction d’exécution (la valeur de toutes les variables locales, le contexte d’exécution).  Les billets Regarde un sont des références à l’état de cette fonction qui peut être créée de différentes manières en JavaScript, mais la meilleure façon de créer une telle référence est d’avoir une fonction locale et passer une référence à cette fonction locale à quelque chose en dehors de la fonction (comme un rappel à une minuterie ou d’un autre objet).  Le parent qui vérifie pour voir s’il est temps de nettoyer le jeu est comme le JavaScript garbage collector (parents désolés).

En JavaScript, tant qu’une partie de votre JavaScript en dehors de votre fonction comporte une référence à une fonction locale à l’intérieur de votre fonction, puis il sera comme quelqu'un qui a un Regarde un billet et le JavaScript garbage collector gardera l’état de la fonction (toutes ses variables locales) autour.  Dès que cette dernière référence est supprimée, le garbage collector sera alors en mesure de nettoyer pour que fonctionner et de se débarrasser de ses variables locales.

En réalité, il y a un certain nombre de façons de créer une fermeture, mais le plus courant est une fonction déclarée localement qui est passée à l’extérieur de la portée de la fonction (comme un rappel d’un certain type) comme une minuterie ou toute autre opération qui prend un rappel.  Aussi longtemps que n’importe quoi fait référence à ce rappel l’état interne de la fonction sera maintenue vivante.  Ce rappel à la fonction est comme émet un Regarde un billet.  Tant que ce billet de rappel/affichage est utilisé, l’état de la fonction (la fermeture) sera maintenue vivante.

Étant donné une fonction elle-même est un objet en JavaScript, j’aime à penser logiquement d’une fonction d’exécution sous forme d’objet où toutes les variables d’instance de cet objet sont les variables locales de la fonction et cet objet (le contexte d’exécution de cette fonction) restera vivant pour aussi longtemps que quelqu'un a une référence à l’objet function en cours d’exécution (comme tous les autres durées de vie objet fonctionnent en JavaScript).  C’est peut-être pas comment cela fonctionne réellement dans la pratique, mais je trouve un moyen utile d’y penser.

Voici un bon article à lire sur fermetures : http://blog.morrisjohns.com/java....


Tags: Programmation informatique, Explications du profane, Programmation fonctionnelle, Explications de l’enfant, 13 (ans), Fermetures