--- title: WeakRef slug: Web/JavaScript/Reference/Global_Objects/WeakRef tags: - Class - JavaScript - NeedsTranslation - Reference - TopicStub - WeakRef translation_of: Web/JavaScript/Reference/Global_Objects/WeakRef ---
{{JSRef}}

WeakRef オブジェクトにより、ガベージコレクションが行われることを妨げない他のオブジェクトへの弱い参照を保持します。

解説

WeakRef オブジェクトはオブジェクトへの弱い参照を含み、これはターゲットまたはリファレントと呼ばれます。オブジェクトへの弱い参照は、ガベージコレクターによるオブジェクトの回収を妨げない参照です。対照的に、通常の (または強い) 参照はオブジェクトをメモリに保持します。オブジェクトが強い参照を持たなくなった場合、 JavaScript エンジンのガベージコレクターはオブジェクトを破棄してメモリを再取得することがあります。そうなると、弱い参照からオブジェクトを取得することはできなくなります。

注: 下記のできる限り避けるの節をご覧ください。正しい WeakRef の使用は注意深く考える必要があり、可能であれば避けるのが最良です。

コンストラクター

{{jsxref("WeakRef/WeakRef", "WeakRef()")}}
新しい WeakRef オブジェクトを生成します。

インスタンスメソッド

{{jsxref("WeakRef.deref", "WeakRef.prototype.deref()")}}
WeakRef オブジェクトの対象オブジェクトを返すか、対象オブジェクトが既に回収されている場合は undefined を返します。

可能な限り避ける

WeakRef の正しい使用には慎重な検討が必要であり、可能であれば避けた方が良いでしょう。また、仕様で保証されていない特定の動作に依存しないことも重要です。ガベージコレクションがいつ、どのように、そしてどのように発生するかは、使用している JavaScript エンジンの実装に依存します。あるエンジンで観察した動作が、別のエンジン、同じエンジンの別のバージョン、あるいは同じエンジンの同じバージョンでも少し違う状況では異なる可能性があります。ガベージコレクションは、 JavaScript エンジンの実装者が常に解決策を改良している難しい問題です。

ここでは、 WeakRef の提案の著者がその説明文書に盛り込んだ具体的なポイントをいくつか紹介します。

ガベージコレクションは複雑です。アプリケーションもしくはライブラリが WeakRef のガベージコレクションの解放処理か、即時にファイナライザ (解放処理のコールバック) の呼出処理に依存している場合は、予想した動作とは異なる動作を行うかもしれません。解放処理は予想よりもかなり後に行われるか、もしくは行われないからです。以下に挙げた様々な原因が考えられます。

WeakRef における注意

Some notes on WeakRefs:

WeakRef オブジェクトの使用

This example starts a counter shown in a DOM element, stopping when the element doesn't exist anymore:

class Counter {
  constructor(element) {
    // Remember a weak reference to the DOM element
    this.ref = new WeakRef(element);
    this.start();
  }

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

    this.count = 0;

    const tick = () => {
      // Get the element from the weak reference, if it still exists
      const element = this.ref.deref();
      if (element) {
        element.textContent = ++this.count;
      } else {
        // The element doesn't exist anymore
        console.log("The element is gone.");
        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"));
counter.start();
setTimeout(() => {
  document.getElementById("counter").remove();
}, 5000);

仕様書

仕様書
{{SpecName('WeakRefs', '#sec-weak-ref-objects', 'WeakRef')}}

ブラウザーの互換性

{{Compat("javascript.builtins.WeakMap")}}

関連情報