12
votes

Peut être chargé de manière dynamique JavaScript être déchargé?

J'écris une application Web disposant d'une "coque" extérieure statique et d'une section de contenu dynamique. La section Dynamic Content contient de nombreuses mises à jour que les utilisateurs naviguent sur le système. Lorsqu'un nouveau bloc de contenu est chargé, il peut également charger éventuellement un autre fichier JavaScript. Au nom de bon ménage, je supprimez les blocs de script du DOM qui s'appliquent aux anciens blocs de contenu, car JavaScript n'est plus nécessaire.

Le problème vient ensuite, lorsque j'ai réalisé que, même si j'ai supprimé l'élément

7 Réponses :


14
votes

Vous pouvez accéder à une approche plus orientée objet et construire le modèle de manière à ce que chaque bloc de blocs JavaScript vienne en tant que propres objets, avec leurs propres méthodes. Lors du déchargement, vous définissez simplement cet objet sur null .


0 commentaires

3
votes

Si vous enregistrez le code évalué dans les espaces de noms, tels que: xxx

"libération", tout cela devrait être aussi simple que de régler le MCPP à une valeur aléatoire, ALA < Pré> xxx

Cela dépend de l'absence d'autre moyen de référencer la variable, qui n'est pas trivial


3 commentaires

Pourquoi ne pas supprimer MyApp ou MyApp = non défini?


Non seulement la variable elle-même, mais également des fermetures qui pourraient être créées soient les fonctions à l'intérieur.


@txwinker: Oui, je suppose que je pensais que c'était implicite. Pour que cela fonctionne, il ne doit y avoir aucune référence à MyApp, ni quoi que ce soit à l'intérieur. Et il y a des détails finiky quand il s'agit de fuir la mémoire, et c'est-à-dire. @Dykam: Aucune raison de ne pas aller non défini, mais j'avais évité de supprimer, car je n'ai pas beaucoup d'expérience avec elle, et un "1" ne devrait pas mettre une énorme déformation de mémoire sur tout ce que l'OP peut faire.



1
votes

Que diriez-vous de charger les fichiers JS dans un iframe? Ensuite (en théorie, ne l'a jamais testé moi-même) Vous pouvez supprimer l'iframe de la DOM et supprimer la "mémoire".

Je pense ... ou j'espère ...


0 commentaires

1
votes

Si vous êtes inquiet des fuites de mémoire, vous voudrez vous assurer qu'il n'y a pas de gestionnaires d'événements dans le code que vous souhaitez supprimer en vous référant à l'arbre Dom toujours existant.

Il est peut-être que vous devez conserver une liste de tous les gestionnaires d'événements que votre code ajouté et avant de décharger, passez et supprimez les gestionnaires d'événements.

Je ne l'ai jamais fait de cette façon, je m'inquiète toujours lorsque je supprimai les nœuds qu'il reste une référence.

Voici un bon article sur les fuites de mémoire JavaScript: http://javascript.crockford.com/memory/leak.html


0 commentaires

9
votes

(c'est assez désactivé.)

Utilisation de la mémoire est en effet un problème que vous devez préoccuper dans l'état actuel du navigateur de la technique, même si vous ne parlez pas beaucoup de code , Je ne sais pas que la taille du code est la question (c'est généralement une taille Dom et des manuelles d'événement de restes). P>

Vous pouvez utiliser un motif pour vos modules chargeux qui faciliteraient beaucoup les décharger en masse - ou au moins, pour laisser le navigateur le savoir peut les em> les télécharger. p>

considérer: p> xxx pré>

qui définit Une fermeture contenant les fonctions foo code> et bar code>, qui peuvent s'appeler de manière normale. Notez que le code des fonctions extérieures fonctionne immédiatement. P>

à condition que vous ne transmettez aucune référence à ce qui est à l'intérieur de la fermeture à quoi que ce soit à l'extérieur, la fenêtre.mymodule sera la seule référence à cette fermeture et son contexte d'exécution . Pour le décharger: P>

if (window.MyModule) {
    try {
        window.MyModule();
    }
    catch (e) {
    }
    try {
        delete window.MyModule;
    }
    catch (e) {
        // Work around IE bug that doesn't allow `delete` on `window` properties
        window.MyModule = undefined;
    }
}


0 commentaires

0
votes

Les interprètes JavaScript ont des collectionneurs à ordures. En d'autres termes, si vous ne faites rien, cela ne les empêchera pas.

Une des raisons pour lesquelles il est bon d'utiliser JSON avec une fonction de rappel (JSONP).

exemple, si la réponse HTTP pour chaque JS est la suivante: xxx

et si le rappel () ne crée pas de référence à l'objet JSON transmis comme une dispute, ce sera la poubelle recueillie après la fin de la fonction.

Si vous avez vraiment besoin de faire une référence, vous avez probablement besoin de ces données pour une raison quelconque - sinon vous le feriez / n'auriez pas dû le référencé la première place.

Les méthodes mentionnées aux objets d'espace de noms créent simplement une référence qui sera persistée jusqu'à ce que le nombre de références soit compris à 0. En d'autres termes, vous devez suivre chaque référence et la supprimer plus tard, ce qui peut être difficile lorsque vous avoir des fermetures et des références de DOM allongé. Une seule référence conservera l'objet en mémoire et certaines opérations simples peuvent créer des références sans que vous ne vous en rendez compte.


0 commentaires

0
votes

belle discussion. Efface beaucoup de choses. J'ai une autre inquiétude, cependant.

si je lie la fenêtre.mymodule.bar () à un événement, que se passe-t-il si l'événement est accidentellement déclenché après la fenêtre.mymodule est supprimé? Pour moi, tout le point de nom de noms et séparant JS en modules chargés dynamiquement consiste à éviter de déclencher le module transversal des manutes d'événements par erreur.

Par exemple, si je le fais (excusez ma jQuery):

$ ('. Quelques classe'). Cliquez sur (window.mymodule.bar);

Que se passe-t-il si je supprime la fenêtre.mymodule, chargez un autre module, puis cliquez sur un élément qui a accidentellement une classe appelée classe?


0 commentaires