Fonction anonyme javascript récupération des ordures

Si j'ai une fonction comme celle-ci

function do(callback) { //do stuff callback(); } 

Et puis je passe une fonction anonyme:

 do(function() { //do something else }); 

Cette fonction anonyme est-elle jamais recueillie pendant la durée de vie de la page? Sinon, comment puis-je le rendre disponible pour GC?

Dois-je faire cela?

 var h = function() { //do something }; do(h); delete h; 

Dois-je m'inquiéter de ça? Je développe une application Web qui a une longue durée de vie, fait beaucoup d'appels ajax qui maintient les objets pendant un certain temps et n'exige pas nécessairement une actualisation de page pour naviguer. Je tente donc de déterminer si je pourrais tomber dans un monstre de fuite de mémoire.

La seule référence à la fonction anonyme est l'argument de la fonction, et cela disparaît lorsque la fonction se termine, de sorte que votre rappel sera disponible pour la collecte des ordures après cela. Sauf lorsque quelque chose d'autre en fait référence, ce qui peut se produire facilement avec les fermetures:

 function doo(callback) { $.get(url, function() { // callback is visible here! }); callback(); } doo(function() { /* do something else */ }); 

callback (ainsi que toute la portée créée en appelant doo ) doit rester dans la mémoire, car la fonction interne peut le faire référence à travers la fermeture; Il ne peut s'agir que d'ordures collectées lorsque la fonction interne est collectée, et puisque cette fonction est une propriété de l'objet jqXHR, cet objet doit être prélevé avant cela et qui sait quand cela se produira …

Mise à jour Vous pouvez éviter les fermetures inutiles en ne définissant pas vos fonctions dans d'autres fonctions:

 var func = function() { // callback is not visible here } function doo(callback) { $.get(url, func); callback(); } doo(function() { /* do something else */ }); 

Faites attention aux références circulaires, sinon le GC pour le navigateur va les nettoyer. Les fermetures rendent très facile de créer une référence circulaire, et cela pourrait être pris au piège dans la mémoire, même si vous vous éloignez de la page qui l'a créée. Ainsi, les applications Web qui restent à l'écran pendant de longues périodes sont particulièrement vulnérables.

Consultez la section "Fuite de mémoire" ici: https://developer.mozilla.org/fr/A_re-introduction_to_JavaScript .

J'ai conçu de nombreuses applications Web en page statique. J'ai constaté que même lorsque vous ne devez pas nettoyer les objets et les gestionnaires d'événements (c'est-à-dire que vous êtes sûr qu'il n'y a pas de référence circulaire), cela ne peut pas nuire. En général, il n'ajoute que quelques lignes supplémentaires de code, et il garde l'utilisation et l'efficacité de la mémoire à l'avant-garde de votre esprit lorsque vous écrivez votre code. C'est un changement pour les développeurs web, car nous ne devons habituellement pas penser à ce genre de choses lors de la création d'un site Web.