Maison > Questions et réponses > le corps du texte
var user = { name: 'tom', age: 20, gender: 'male' }
var test = document.getElementById('test');
test.onclick = function() {
test.innerHTML = user.name;
}
user = null; // 释放对象
J'ai récemment rencontré une question d'entretien comme celle-ci. Y a-t-il une fuite de mémoire dans ce paragraphe ? Si oui, quelqu'un pourrait-il expliquer pourquoi et comment éliminer la fuite de mémoire ?
给我你的怀抱2017-05-19 10:44:35
Memory Leak En termes simples, la mémoire allouée ne peut pas être utilisée ou recyclée jusqu'à la fin du processus du navigateur.
Pour le problème de référence circulaireÉliminez simplement la référence et définissez le test=null
,因为js
mécanisme de collecte des orduresIl sera exécuté périodiquement pour connaître ceux qui ne sont plus utilisés# 🎜🎜#Variable, puis libèrent la mémoire occupée par celle-ci.Garbage collection
仅有的幸福2017-05-19 10:44:35
Le principe est celui indiqué dans l'image ci-dessous. Votre test est elem dans l'image. Il fait référence à un élément dom et ajoute un gestionnaire d'événements à l'élément dom. Cependant, la fonction de traitement des événements fait référence au test dans la portée externe, c'est donc comme suit : Cela devient une référence circulaire.
Ce qui semble être une fuite de mémoire est en réalité le test plutôt que l'utilisateur. Effacer la référence au test externe peut détruire cette référence circulaire.
En fait, cela ne posera pas de problème dans les navigateurs modernes grâce à l'utilisation d'algorithmes de marquage et de balayage. Dans les anciens navigateurs, l'algorithme de récupération de place ne provoquera que des fuites de mémoire dues aux références, c'est-à-dire que les références circulaires provoqueront des objets. être indisponible et ne peut toujours pas être recyclé.
世界只因有你2017-05-19 10:44:35
Qu'est-ce qu'une fuite de mémoire ?
Cela provoquera une erreur d'exécution. . . . . .
巴扎黑2017-05-19 10:44:35
Décidément, c'est inclus dans les questions d'entretien CVTE. Étant donné que la référence à user.name est conservée dans l'événement click, elle sera toujours divulguée.
Quant à savoir comment éliminer le problème, la seule chose à laquelle je pense est de le déréférencer directement comme mentionné dans le post