les "nouveaux" sans "supprimer" sur la même variable en Javascript
Est-il OK pour ce faire?:
function mygetTime()
{
var d = new Date();
return(d.getTime());
}
function wasteSomeMemory()
{
var temp;
for(var count = 0; count < 1000000; count += 1)
{
temp = mygetTime();
}
}
Va appeler wasteSomeMemory()
provoquer une fuite de mémoire?
Quoi à ce sujet:
function wasteSomeMemory2()
{
var temp;
for(var count = 0; count < 1000000; count += 1)
{
temp = new Date();
}
}
Va appeler wasteSomeMemory2()
provoquer une fuite de mémoire? Dois-je utiliser delete temp;
à la fin de la boucle for?
function wasteSomeMemory2()
{
var temp;
for(var count = 0; count < 1000000; count += 1)
{
temp = new Date();
delete temp;
}
}
OriginalL'auteur Mateen Ulhaq | 2011-02-02
Vous devez vous connecter pour publier un commentaire.
new
etdelete
n'ont rien à voir les uns avec les autres en JavaScript (en dépit de leur confusion similitude complètement différentes constructions dans d'autres langues). Ne vous inquiétez pas au sujet de la création d'objets (new
), sans explicitement le nettoyage, c'est le garbage collector du travail.new
est pour la création d'objets à l'aide des fonctions constructeur.delete
, d'autre part, est pour la suppression des propriétés des objets. Il a rien à voir avec la suppression d'un objet de mémoire, autre que l'un des effets secondaires (par exemple, si le seul suspens référence à l'objet en était de la propriété que vous avez supprimés).Exemple d'utilisation correcte de
delete
:Votre
getmyTime
fonction est parfaitement bien. LeDate
de l'objet peuvent être récupérés immédiatement après retour de la fonction (si elle est récupérée est complètement jusqu'à la mise en œuvre). Il n'a pas de provoquer une fuite de mémoire, sauf sur un buggy de mise en œuvre.Votre
wasteSomeMemory2
de même ne pas provoquer une fuite de mémoire, et en fait, vous ne peut pas appeldelete temp;
— vous ne pouvez supprimer que les propriétés, pas de vars.Il sont des moments où vous devez aider le garbage collector, mais ceux qui ne font généralement pas (dans mon expérience) ont à voir avec les propriétés de l'objet, et donc ne pas impliquer
delete
. Ils ne sont vraiment si vous êtes à la création de la fonction d'instances (ce qui est assez souvent, si vous êtes en train de configurer les gestionnaires d'événements ou de fonctions de minuterie, etc.). Par exemple, pensez à:Parce que votre fonction anonyme que vous avez attribué à une minuterie via
setInterval
survivra à l'appel de la fonction, il garde un live de référence pour tout ce qui a été portée au cours de cet appel de fonction (s'il utilise ou non). Cela permet de maintenir la liste des choses quelistOfThings
points de mémoire. Si la fonction de la minuterie n'a pas besoin de cette liste, c'est un sujet de préoccupation. Vous pouvez relâcher la liste quilistOfThings
points à si vous savez que la fonction n'a pas besoin d'elle, par l'attributionundefined
ounull
ou n'importe quoi d'listOfThings
lorsque vous avez terminé avec elle:La même chose est vraie pour les fonctions de gestionnaire d'événements, etc. Chaque fois que vous créez une fonction, il "ferme" (conserve un live de référence) rien dans le champ où il a été défini. Donc, si vous n'avez pas besoin de ces choses, vous pouvez vous assurer qu'ils ne sont pas gardés en mémoire par la compensation de la des références. (Plus: Fermetures ne sont pas compliqué)
OriginalL'auteur T.J. Crowder
La réponse courte est non.
La réponse longue est, nous l'espérons, à dieu le parcours garbage collector capte.
OriginalL'auteur Raynos