2015-09-21 1 views
6
function f() { 
    const w = new WeakMap(); 
    const o = {}; 

    w.set(o, { v: o }); 

    return w; 
} 

const weakMap = f(); 

Pour le code donné, le seul article weakMap est-il considéré comme accessible ou non? Par conséquent, sera-t-il ramassé ou non? PS: Cette question est posée du point de vue de la spécification, et non des implémentations particulières.Une référence "circulaire" serait-elle traitée comme "accessible" pour un WeakMap?

+1

Ce n'est pas censé. Les choses qui n'ont que des références circulaires sont éligibles pour la collecte des ordures, elles ne devraient donc pas rester dans la carte weakMap. – jfriend00

+0

Je disais qu'il devrait être publié car il n'y a pas de références externes et donc il n'est pas accessible ailleurs. – jfriend00

+0

Qu'en est-il de cet exemple circulaire? – loganfsmyth

Répondre

8

Citant WeakMap Objects section,

Si un objet qui est utilisé comme la clé d'une paire de clés WeakMap/valeur est uniquement accessible en suivant une chaîne de références qui commencent dans ce WeakMap, alors cette clé/valeur La paire est inaccessible et est automatiquement retirée du WeakMap.

Dans votre cas, la seule façon d'atteindre o serait de commencer à partir de l'une des clés du weakMap, car il n'y a pas de références externes à elle. Donc, ce serait considéré comme inaccessible.

Les implémentations WeakMap doivent détecter et supprimer ces paires clé/valeur et les ressources associées.

Ainsi, il serait éventuellement collecté.