2016-03-02 1 views
0

Quelle est l'utilisation correcte de WeakMap dans JavaScript? Quel genre de problèmes de synchronisation peuvent se produire lorsque je l'utilise? En particulier, je me demande ce qui se passerait dans la situation suivante:Problèmes de synchronisation lors de l'utilisation de WeakMap d'EcmaScript

var wm1 = new WeakMap() 
var o1 = {}, 
o2 = function(){}, 
o3 = window; 
// in other method: 
    wm1.set(o1, 37); 
    wm1.set(o2, "azerty"); 
    if (wm1.has(o2)) { 
    //Garbage collection happen here, objects from wm1 may no longer exists 
    Console.log(wm1.get(o2)) // what will happen here? just undefined? null? 
    } 

comment GC affectera WeakMaps?

Mise à jour: ma mauvaise, j'ai raté le fait que vous ne pouvez pas avoir de chaîne en tant que clés dans WeakMap, ma question ne fait pas si je prends en compte ce fait.

Répondre

1

WeakMap s sont explicitement conçus pour ne pas présenter le comportement de récupération de place le moins observable. Il n'y aura absolument aucun problème.

Dans votre situtation spécifique, aussi longtemps que vous tenez une référence à l'objet ou à la fonction (par les variables en direct o1 et o2 qui sont encore sur la pile), vous pourrez les trouver dans le WeakMap ou WeakSet. Dès que vous ne les connaissez plus, et personne ne le fait, ils sont éligibles pour la collecte des ordures (comme d'habitude) - et étant donné cela, personne ne pourra essayer de les rechercher dans la collection.

+0

merci! Que faire si la clé de la carte est une chaîne? – vmg

+1

@VitaliyGanzha: C'est la raison pour laquelle vous ne pouvez pas utiliser les chaînes comme clés dans une collection faible :-) – Bergi