[ Web Proxy ]
URL:
Viewing: https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Global_Objects/WeakRef [Back]  [Original]

WeakRef - JavaScript | MDN

Cette page a t traduite partir de l'anglais par la communaut. Vous pouvez contribuer en rejoignant la communaut francophone sur MDN Web Docs.

View in English Always switch to English

WeakRef

Baseline Large disponibilit *

Cette fonctionnalit est bien tablie et fonctionne sur de nombreux appareils et versions de navigateurs. Elle est disponible sur tous les navigateurs depuis avril 2021.

* Certaines parties de cette fonctionnalit peuvent bnficier de prise en charge variables.

Un objet WeakRef permet de tenir une rfrence faible vers un autre objet, sans empcher que ce dernier puisse tre rcupr par le ramasse-miettes.

Dans cet article

Description

Un objet WeakRef contient une rfrence faible vers un objet, appel cible ou rfrent. Une rfrence faible vers un objet est une rfrence qui n'empche pas l'objet d'tre rcupr par le ramasse-miettes. l'inverse, une rfrence normale (aussi qualifie de forte) implique de conserver un objet en mmoire. Lorsqu'un objet n'a plus de rfrence forte envers lui, le ramasse-miettes du moteur JavaScript peut dtruire l'objet et rcuprer la mmoire correspondante. Une fois que cela est fait, on ne peut plus accder l'objet depuis une rfrence faible.

Note : Voir la section viter si possible ci-aprs. Une utilisation correcte et pertinente de WeakRef ncessite une rflexion appuye. C'est un objet qu'il conviendra d'viter si possible.

Constructeur

WeakRef()

Cre un nouvel objet WeakRef.

Mthodes d'instance

WeakRef.prototype.deref()

Renvoie l'objet cible de l'objet WeakRef, ou undefined si l'objet cible a t rcupr.

viter si possible

Une utilisation correcte de WeakRef ncessite une rflexion suffisante et il est prfrable d'avoir utiliser ces traitements si possible. Il est galement important d'viter d'avoir dpendre de fonctionnements spcifiques non garantis par la spcification. Le moment, la faon et l'excution mme du ramasse-miettes dpendent minemment de l'implmentation du moteur JavaScript. Tout comportement observ pour un moteur pourra tre diffrent dans un autre moteur, dans une version diffrente du mme moteur ou encore mme dans une situation lgrement diffrente et pour la mme version du mme moteur. La gestion du ramasse-miettes est un problme complexe sur lequel travaillent constamment les personnes qui implmentent les moteurs JavaScript.

Voici quelques sujets spcifiques inclus dans le document explicatif de la proposition correspondante :

Les ramasses-miettes sont compliqus. Si une application ou une bibliothque dpend d'un ramasse-miettes nettoyant un registre FinalizationRegistry ou appelant un finaliseur de faon prcise et prdictible, qu'elle se prpare tre due : le nettoyage pourra avoir lieu bien plus tard que prvu voire pas du tout. Ce comportement grandement variable est d :

  • Au fait qu'un objet peut tre rcupr par le ramasse-miettes bien plus tt qu'un autre, mme s'il devient inaccessible au mme temps, par exemple en raison du ramassage gnrationnel.
  • l'action du ramasse-miettes qui peut tre divise dans le temps en utilisant des techniques incrmentales et concurrentes.
  • des heuristiques d'excution qui peuvent tre utilises afin d'quilibrer l'usage de la mmoire et la ractivit.
  • Au moteur JavaScript qui pourra tenir des rfrences envers des choses qui semblent inaccessibles (comme des fermetures ou des caches en ligne).
  • la diffrence des moteurs JavaScript ou au changement d'algorithmes pour un mme moteur au fur et mesure de ses diffrentes versions.
  • des facteurs complexes pouvant maintenir en vie des objets pendant une priode indfinie comme avec l'utilisation de certaines API.

Notes sur WeakRef

Quelques notes propos des objets WeakRef :

  • Si votre code vient de crer un objet WeakRef pour un objet cible, ou vient d'obtenir un objet cible via la mthode deref, cet objet cible ne sera pas rcupr avant la fin de la tche courante (incluant toutes les tches de raction aux promesses qui s'excutent la fin de la tche de script). Autrement dit, on ne peut  voir  un objet tre rcupr qu'entre des tours de la boucle d'vnement. L'objectif premier est d'viter d'exposer le comportement interne du ramasse-miettes du code JavaScript (afin d'viter que des personnes tirent des hypothses hasardeuses sur le fonctionnement du ramasse-miettes qui est constamment en volution).
  • Si plusieurs WeakRef partagent la mme cible, leurs tats sont cohrents. Le rsultat d'un appel deref sur l'un d'entre eux correspondra au rsultat d'un appel deref sur un autre. Il n'est pas possible d'obtenir l'objet cible depuis l'un et undefined depuis l'autre.
  • Si la cible d'un objet WeakRef appartient galement un registre FinalizationRegistry, la cible WeakRef est nettoye au mme moment ou avant toute fonction de rappel de nettoyage. Si votre fonction de rappel de nettoyage appel deref sur une WeakRef pour l'objet rcupr, la fonction recevra undefined.
  • Il n'est pas possible de changer la cible d'un objet WeakRef, ce sera toujours la cible originelle ou undefined si la cible a t rcupre.
  • Un objet WeakRef pourraient ne jamais renvoyer undefined avec deref, mme si aucune rfrence forte n'existe envers l'objet cible, car le ramasse-miettes peut ne jamais dcider de rcuprer l'objet.

Exemples

Utiliser un objet WeakRef

Dans cet exemple, on dmarre un compteur dans un lment DOM et on l'arrte quand l'lment n'existe plus :

js
class Counter {
  constructor(element) {
    // On attache une rfrence faible  l'lment du DOM
    this.ref = new WeakRef(element);
    this.start();
  }

  start() {
    if (this.timer) {
      return;
    }

    this.count = 0;

    const tick = () => {
      // On rcupre l'lment depuis la rfrence faible s'il existe encore
      const element = this.ref.deref();
      if (element) {
        element.textContent = ++this.count;
      } else {
        // Dans ce cas, l'lment n'existe plus
        console.log("L'lment n'est plus.");
        this.stop();
        this.ref = null;
      }
    };

    tick();
    this.timer = setInterval(tick, 1000);
  }

  stop() {
    if (this.timer) {
      clearInterval(this.timer);
      this.timer = 0;
    }
  }
}

const counter = new Counter(document.getElementById("counter"));
setTimeout(() => {
  document.getElementById("counter").remove();
}, 5000);

Spcifications

Spcification
ECMAScript 2027 LanguageSpecification
# sec-weak-ref-objects

Compatibilit des navigateurs

Voir aussi


Web Proxy Viewer  |  New URL  |  Original Page