Aussi loin que je peux dire, ce n'est pas un bug mais le comportement attendu.
À partir de Mozilla gestion de la Mémoire à la page: "à compter de 2012, tous les navigateurs modernes expédier un mark-and-sweep ramasse-miettes." "Limitation: les objets doivent être formulées explicitement inaccessible".
Dans vos exemples où il échoue some
est toujours accessible dans la fermeture. J'ai essayé les deux façons de le rendre inaccessible et travaillent tous les deux. Soit vous définissez some=null
lorsque vous n'en avez plus besoin, ou vous définissez window.f_ = null;
et il aura disparu.
Mise à jour
Je l'ai essayé sur Chrome 30, FF25, Opera 12 et IE10 sous Windows.
La norme ne dit rien à propos de la collecte des ordures, mais donne quelques indices de ce qui doit arriver.
- L'article 13 de définition de Fonction, à l'étape 4: "Laissez-fermeture à être le résultat de la création d'une nouvelle Fonction d'objet comme indiqué dans 13.2"
- La Section 13.2 "un Environnement Lexical spécifié par Portée (scope = fermeture)
- La Section 10.2 Lexicale Environnements:
"La référence externe (ou interne) Environnement Lexical est une référence à l'Environnement Lexical qui, logiquement,
entoure l'intérieure Environnement Lexical.
Extérieur-Environnement Lexical peut, bien entendu, ses propres extérieur
Environnement Lexical. Un Environnement Lexical peut servir que de l'environnement extérieur pour de multiples intérieure Lexicale
Les environnements. Par exemple, si une Déclaration de Fonction contient deux imbriqués les Déclarations de Fonction puis Lexicales
Les environnements de chacune des fonctions imbriquées auront que leurs externe Environnement Lexical Lexical de la
L'environnement de l'exécution actuelle de l'entourage de fonctionner".
Donc, une fonction qui permet d'avoir accès à l'environnement de la mère.
Donc, some
devrait être disponible dans la fermeture de retour de la fonction.
Alors pourquoi n'est-il pas toujours disponible?
Il semble que Chrome et FF est assez intelligent pour éliminer la variable dans certains cas, mais dans les deux Opera et IE l' some
variable est disponible dans la fermeture (NB: pour voir ce définissez un point d'arrêt sur l' return null
et de vérifier le débogueur).
Le GC peut être amélioré pour détecter si some
est utilisé ou non dans les fonctions, mais il sera compliqué.
Un mauvais exemple:
var someClass = function() {};
function f() {
var some = new someClass();
return function(code) {
console.log(eval(code));
};
}
window.f_ = f();
window.f_('some');
Dans l'exemple ci-dessus, le GC a aucun moyen de savoir si la variable est utilisé ou non (code testé et fonctionne dans Chrome30, FF25, Opera 12 et IE10).
La mémoire est libérée si la référence à l'objet est brisé par l'attribution d'une autre valeur de window.f_
.
À mon avis, ce n'est pas un bug.