103 votes

Est-il possible de créer une "référence faible" en javascript?

Existe-t-il un moyen en javascript de créer une "référence faible" à un autre objet? Voici la page wiki décrivant ce qu'est une référence faible. Voici un autre article qui les décrit en Java. Quelqu'un peut-il penser à un moyen d'implémenter ce comportement en javascript?

43voto

bobince Points 270740

Il n'y a pas de support de la langue pour weakrefs en JavaScript. Vous pouvez rouler votre propre en utilisant le manuel de comptage de référence, mais n'est pas spécialement bien. Vous ne pouvez pas faire un proxy objet wrapper, parce que dans les objets JavaScript ne savez jamais quand ils sont sur le point d'être récupérées.

Si votre ‘faiblesse de référence " devient une clé (par exemple. entier) dans une recherche simple, avec un complément de référence et retirez-la méthode de référence, et quand il n'y a pas manuellement-suivi des références de plus que l'entrée peut être supprimé, laissant l'avenir des recherches sur cette touche pour retourner la valeur null.

Ce n'est pas vraiment un weakref, mais il peut résoudre certains des mêmes problèmes. C'est habituellement le cas dans les applications web complexes pour empêcher des fuites de mémoire à partir de navigateurs (généralement, c'est à dire, en particulier les anciennes versions) lorsqu'il y a une boucle de référence entre un Nœud DOM ou gestionnaire d'événements, et un objet associé à comme la fermeture. Dans ces cas, la référence complète-méthode de comptage peuvent même ne pas être nécessaire.

15voto

Scholle Points 423

Lorsque vous exécutez JS sur NodeJS, vous pouvez considérer https://github.com/TooTallNate/node-weak .

3voto

Amir Points 3237

Juste pour référence; JavaScript ne l'a pas, mais ActionScript 3 (qui est également ECMAScript). Consultez le paramètre constructeur pour Dictionnaire .

2voto

JL235 Points 659

La vraie faiblesse de références, non, pas encore (mais les éditeurs de navigateurs sont à la recherche sur le sujet). Mais voici une idée sur la manière de simuler les références faibles.

Vous pourriez construire un cache qui vous conduisez vos objets par. Lorsqu'un objet est stocké, le cache conserve une prédiction de la quantité de mémoire de l'objet. Pour certains éléments, comme le stockage d'images, c'est simple. Pour d'autres, ce serait plus difficile.

Lorsque vous avez besoin d'un objet, vous demandez ensuite le cache pour qu'il. Si le cache est l'objet, il est renvoyé. Si elle n'y est pas, alors l'élément est généré, stockées, et est ensuite retourné.

Les références faibles sont simulés par le cache, supprimer des éléments, lorsque le montant total de la valeur prédite de la mémoire atteint un certain niveau. Il va prédire les éléments qui sont moins utilisées en fonction de la façon dont souvent ils sont récupérés, pondérée par la façon dont il y a longtemps, ils ont été retirés. Un calcul de coût peuvent également être ajoutés, si le code qui crée l'article est adopté dans la cache comme une fermeture. Cela permettrait d'en cache pour garder les objets qui sont très coûteux à construire ou à générer.

La suppression de l'algorithme est la clé, parce que si vous obtenez cette erreur, alors vous pourriez vous retrouver en supprimant les articles les plus populaires. Ce serait la cause de terribles performance.

Tant que le cache est le seul objet à permanent des références vers les objets stockés, puis le système ci-dessus devrait fonctionner assez bien comme une alternative à la vraie références faibles.

-6voto

branchgabriel Points 2436

http://www.jibbering.com/faq/faq_notes/closures.html

ECMAScript utilise la collecte des ordures. La spécification ne définit pas les détails, laissant cette tâche à la mise en œuvre de trier, et certaines implémentations sont connus pour donner la priorité la plus faible de leurs déchets, les opérations de collecte. Mais l'idée générale est que si un objet devient non reconductibles (en ayant pas d'autres références à la gauche accessibles à l'exécution de code), il devient disponible pour la collecte des ordures et à un certain moment de l'avenir être détruits et les ressources qu'il consomme libéré et renvoyé dans le système à des fins de réutilisation.

Ce qui serait normalement le cas lors de la sortie d'un contexte d'exécution. La portée de la structure de la chaîne, l'Activation/la Variable objet et tous les objets créés dans le contexte d'exécution, y compris la fonction des objets, n'est plus accessible et donc deviendrait disponible pour la collecte des ordures.

Sens il n'y a pas de faibles seuls qui ne sont plus disponibles.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X