Que fait backbone.j avec les modèles qui ne sont plus utilisés

Dernièrement, je plonge dans tous les aspects de conception MVC / MVVM côté client, et celui qui m'intéresse particulièrement est backbone.js.

Une chose que je ne comprend pas bien est ce qui arrive aux modèles quand ils ne sont plus vraiment nécessaires.

Disons que nous avons une application qui possède des utilisateurs et des produits. Nous avons des modèles / vues utilisateur et des modèles / vues de produits

REMARQUE: pour des raisons de simplicité, nous ne sommes pas un utilisateur . Nous pouvons simplement créer des utilisateurs / produits CRUD.

Lorsque j'entre dans la page des produits, je suppose que nous chargeons le modèle et la vue correspondant à cela.

Que se passe-t-il lorsque nous quittons la page et entrez la page des utilisateurs. Un modèle / vue utilisateur est chargé, mais les produits sont également chargés.

Est-ce que nous les gardons chargés, l'épine dorsale prend-il soin de cela pour vous ou est-ce que vous devez explicitement mettre fin à certains objets?

L'épine dorsale ne traite pas explicitement des objets de nettoyage pour vous. C'est 50/50 vous et le temps d'exécution JavaScript.

JavaScript est une langue récupérée comme Java, C #, Ruby et autres. La base d'une collecte des données collectées est qu'un objet encore référencé par votre application ne sera pas nettoyé. Le compteur à ce sujet est quand un objet n'est plus référencé par votre application, sera nettoyé.

JavaScript en général:

Lorsque vous créez une variable, vous pouvez soit étendre cette variable à une fonction locale, soit en tant que variable globale.

Les variables globales ne sont jamais nettoyées par le collecteur d'ordures pendant la durée de vie de la page. La seule fois où ils sont nettoyés, c'est lorsque vous laissez la page HTML derrière vous – naviguez vers une page différente et forcer le navigateur à charger la nouvelle page du serveur (faire un rafraîchissement complet du serveur) ou fermer le navigateur ou l'onglet du navigateur.

Les variables de portée de la fonction sont nettoyées lorsque la variable échappe à la portée, c'est-à-dire lorsque la fonction est terminée et qu'il n'y a plus de références. Il y a quelques exceptions à cela: valeurs de retour et fermetures.

Une valeur de retour est retenue dans votre application en attribuant la valeur de retour à une autre variable. Une valeur de retour relève des mêmes règles générales, mais la variable est maintenant dans une fonction différente. Une fois que cette variable est hors de portée, elle peut être nettoyée.

Une fermeture permet à une portée parentale de fournir des valeurs auxquelles une portée descendante peut accéder. Lorsque la portée du descendant est nettoyée, la variable fermée du parent peut être autorisée à être nettoyée (en supposant que rien d'autre ne l'empêche).

Les objets avec des attributs et des fonctions relèvent des mêmes règles. Un objet peut référencer un autre objet ou fonction en lui attribuant un attribut: myObj.foo = thatObj .

Le DOM (Document Object Model – le HTML dans votre application) est un objet JavaScript. Les événements et autres références à votre DOM fonctionnent de la même manière que toute autre référence. Si vous avez un objet traitant un événement DOM, il a une référence dans votre application et il ne sera pas nettoyé par le collecteur d'ordures. Si vous voulez le nettoyer, vous devez enlever toutes les références à celui-ci – y compris la référence DOM du gestionnaire d'événements.

Nettoyage de la mémoire

La règle générale est que si vous chargez des données dans une collection ou un objet squelettique et que vous souhaitez que cet objet soit nettoyé, il ne faut plus utiliser de mémoire, vous devez supprimer toutes les références à cet objet. Ce n'est que la règle de récupération de prélèvement JavaScript standard.

Vous ne pouvez pas forcer la collecte des ordures, mais vous pouvez forcer une variable à renvoyer la chose qu'il appelle à utiliser le mot-clé delete dans JavaScript: delete myVar

Colonne vertébrale

Backbone est JavaScript donc il tombe sous les mêmes règles. Il existe des utilisations intéressantes des fermetures et des références dans Backbone dont vous devez être conscient, ce qui vous aidera à savoir quand vous devez nettoyer manuellement certains objets.

Par exemple: événements. Une méthode de gestionnaire / callback uniforme fonctionne en ayant une référence entre l'objet qui déclenche l'événement et le rappel qui gère l'événement. C'est l'un des endroits les plus faciles à générer des fuites de mémoire dans une application Backbone et je discute en détail ici: http://lostechies.com/derickbailey/2011/09/15/zombies-run-managing-page-transitions- In-backbone-apps /

En plus d'être conscient de la façon dont les événements fonctionnent en termes de références, il suffit de suivre les règles standard pour gérer la mémoire en JavaScript et vous allez bien. Une fois que vous avez supprimé toutes les références à cette collection d'objets utilisateur, elles seront nettoyées.

Notez que si vous console.log() votre modèle (au moins dans Chrome), il restera en mémoire car la console en fait référence.

Je me suis fâché à cause de cela. Si vous voyez une fuite de mémoire, essayez d'effacer votre console et d'exécuter votre profil à nouveau. Si vous avez eu le même problème que j'ai eu, c'est parti 🙂