Peut charger dynamiquement en JavaScript être déchargé?
Je suis en train d'écrire une application web qui a un statique externe "shell" et d'une dynamique de contenu de l'article. Le contenu dynamique de la section a de nombreuses mises à jour que les utilisateurs à naviguer dans le système. Lorsqu'un nouveau bloc de contenu est chargé, il peut également charger un autre fichier JavaScript. Au nom de la bonne gestion, j'ai supprimer des blocs de script à partir du DOM qui s'appliquent à de vieux blocs de contenu, depuis que JavaScript n'est plus nécessaire.
Le problème vient après, quand j'ai réalisé que, bien que j'ai supprimé les <script>
élément du DOM, le code JavaScript qui a déjà été évalué est toujours disponible pour l'exécution. Qui fait sens, bien sûr, mais je suis inquiet qu'il peut provoquer une fuite de mémoire si les utilisateurs de naviguer à beaucoup de différentes sections.
La question qui se pose alors, est-ce que je devrais être inquiet de cette situation? Si oui, est-il un moyen pour forcer le navigateur à un nettoyage rassis JavaScript?
OriginalL'auteur Andy | 2009-08-28
Vous devez vous connecter pour publier un commentaire.
<theory>
Vous pourriez aller avec une approche orientée objet, et de construire le modèle en sorte que chaque bloc de blocs javascript venez en tant que leurs propres objets, avec leurs propres méthodes. Lors du déchargement, il vous suffit de définir l'objet denull
.</theory>
OriginalL'auteur Sampson
(C'est assez hors-la-brassard.)
L'utilisation de la mémoire est en effet une question que vous devez être concernés dans le navigateur actuel de l'état de l'art, bien que, à moins que nous parlons beaucoup de code, je ne sais pas que la taille du code est la question (il est généralement DOM taille, et les restes des gestionnaires d'événements).
Vous pouvez utiliser un modèle pour votre forme de modules chargeables qui le rendrait beaucoup plus facile de les décharger en masse, ou au moins, pour laisser le navigateur sait qu'il peut les décharger.
Considérer:
Qui définit une fermeture qui contient les fonctions
foo
etbar
, qui peuvent s'appeler les uns les autres de façon normale. Notez que le code en dehors des fonctions s'exécute immédiatement.À condition que vous ne passez pas de références à ce qui est à l'intérieur de la fermeture à rien en dehors d'elle, puis la fenêtre.MyModule sera la seule référence à la fermeture et à son contexte d'exécution. Pour décharger:
Qui raconte l'environnement JavaScript vous n'êtes pas à l'aide de cette propriété, et de plus, fait tout ce qu'il références disponibles pour la collecte des ordures. Quand et si cette collection qui se passe est évidemment dépendant de l'implémentation.
Noter qu'il sera important si vous raccordez des gestionnaires d'événements dans le module de décrocher avant le déchargement. Vous pourriez le faire en retournant une référence à une fonction destructeur au lieu de la fermeture principale:
Décrochage est alors:
OriginalL'auteur T.J. Crowder
Si vous enregistrez le évalués code dans les espaces de noms, tels que:
De"libérer" le tout devrait être aussi simple que la mise MYPP certaine valeur aléatoire, ala
Cela ne dépend-il pas d'autre moyen de la référence à la variable, ce qui n'est pas trivial
Non seulement la variable elle-même, mais aussi de toutes les fermetures qui pourraient être créés à l'fonctions à l'intérieur.
Oui, je crois que j'ai senti que c'était implicite. Pour que cela fonctionne, il doit y avoir pas de références ni de MYAPP, ni rien à l'intérieur. Et il y a certains détails méticuleux quand il s'agit d'une fuite de mémoire, et IE. @Dykam: Pas de raison pour ne pas aller pas défini, mais j'ai évité les supprimer, car je n'ai pas beaucoup d'expérience avec elle, et un "1" ne devrait pas mettre un énorme mémoire de la souche sur ce que l'OP peut être en train de faire.
OriginalL'auteur Svend
Comment sur le chargement de la JS fichiers dans un iframe? Puis (en théorie, jamais testé moi-même) vous pouvez supprimer l'iframe à partir du DOM et de supprimer le "mémoire" qu'il utilise.
Je pense... du moins je l'espère...
OriginalL'auteur elcuco
Si vous êtes inquiet à propos des fuites de mémoire, alors vous aurez envie de faire certains qu'il n'y a pas de gestionnaires d'événements dans le code que vous souhaitez supprimer en se référant à l'arborescence dom.
Peut-être que vous avez besoin de garder une liste de tous les événements de votre code ajouté, et avant le déchargement, allez à travers et supprimer les gestionnaires d'événements.
Je n'ai jamais fait de cette façon, j'ai toujours un soucis quand je supprimer des nœuds qu'il y a toujours une référence.
Voici un bon article sur le javascript fuites de mémoire:
http://javascript.crockford.com/memory/leak.html
OriginalL'auteur James Black
JavaScript interprètes ont ramasseurs d'ordures. En d'autres termes, si vous n'avez pas de référence de n'importe quoi, il ne sera pas les garder autour.
Une des raisons pour lesquelles il est bon d'utiliser JSON avec une fonction de rappel (JSONP).
exemple, si vous avez la réponse HTTP pour chaque JS est:
Et si la fonction de rappel() ne crée pas une référence à l'objet JSON passé en argument, elle sera nettoyée une fois la fonction terminée.
Si vous avez vraiment besoin de faire une référence, alors vous avez probablement besoin de données pour une raison quelconque, sinon vous/ne devriez PAS avoir référencé dans la première place.
Les méthodes mentionnées à l'espace de noms d'objets, il suffit de crée une référence qui sera conservée jusqu'à ce que le compteur de référence vient à 0. En d'autres termes, vous devez assurer le suivi de chaque référence et le supprimer par la suite, ce qui peut être difficile quand vous avez des fermetures et des références de DOM qui traînent. Juste une référence permettra de garder l'objet en mémoire, et quelques opérations simples peuvent créer des références sans vous en rendre compte.
OriginalL'auteur bucabay
Belle discussion. Efface beaucoup de choses. J'ai un autre souci, si.
Si je la lie de la fenêtre.MyModule.bar() à un événement, ce qui se passe si l'événement est accidentellement déclenché après la fenêtre.MyModule est supprimé? Pour moi, le point de l'ensemble de namespacing et de séparer les js dans les modules chargés dynamiquement est pour éviter le déclenchement des gestionnaires d'événement de la croix-module par erreur.
Par exemple, si je n' (excusez mon jQuery):
$('.quelques-classe").cliquez sur(fenêtre.MyModule.bar);
Qu'advient-il si je supprime la fenêtre.MyModule, de charger un autre module, et cliquez sur un élément qui a accidentellement une classe appelée certaines de classe?
OriginalL'auteur Miloš Rašić