このページはコミュニティーの尽力で英語から翻訳されました。MDN Web Docs コミュニティーについてもっと知り、仲間になるにはこちらから。

View in English Always switch to English

FinalizationRegistry.prototype.unregister()

Baseline 広く利用可能 *

この機能は広く実装されており、多くのバージョンの端末やブラウザーで動作します。2021年4月以降、すべてのブラウザーで利用可能です。

* この機能の一部は、対応レベルが異なる場合があります。

unregister()FinalizationRegistry インスタンスのメソッドで、対象のオブジェクトをこの FinalizationRegistry から登録解除します。

構文

js
unregister(unregisterToken)

引数

unregisterToken

対象値を登録する際に、register() メソッドで使用されたトークンです。同じ unregisterToken で登録された複数のセルは、まとめて登録解除されます。

返値

論理値で、少なくとも 1 つのセルが登録解除された場合は true、登録解除されたセルがない場合は false となります。

例外

TypeError

unregisterToken がオブジェクトでも未登録シンボルでもない場合に発生します。

解説

対象オブジェクトの回収が完了すると、レジストリーに登録された状態ではなくなります。 クリーンアップコールバックですべてに unregister を行う必要はありません。クリーンアップコールバックを受信しておらず、クリーンアップコールバックを受信する必要がなくなった場合にのみ unregister を呼び出してください。

unregister の使用

この例では、登録解除トークンとして同じオブジェクトを使用して対象のオブジェクトを登録し、その後、 unregister を介して対象のオブジェクトの登録を解除します。

js
class Thingy {
  static #cleanup = (label) => {
    //               ^^^^^−−−−− 保持値
    console.error(
      `ラベル "${label}" を持つオブジェクトに対して、"release" メソッドは一度も呼び出されませんでした。`,
    );
  };
  #registry = new FinalizationRegistry(Thingy.#cleanup);

  /**
   * `Thingy` インスタンスを構築します。
   * 使用が終わったら、必ず `release` を呼び出してください。
   *
   * @param label `Thingy` のラベルです。
   */
  constructor(label) {
    //                            vvvvv−−−−− 保持値
    this.#registry.register(this, label, this);
    //       対象 −−−−−^^^^         ^^^^−−−−− unregister トークン
  }

  /**
   * Releases resources held by this `Thingy` instance.
   */
  release() {
    this.#registry.unregister(this);
    //                        ^^^^−−−−− unregister トークン
  }
}

この例では、登録解除トークンとして別のオブジェクトを使用して対象のオブジェクトを登録しています。

js
class Thingy {
  static #cleanup = (file) => {
    //               ^^^^−−−−− 保持値
    console.error(
      `ファイル名 "${file.name}" の "Thingy" に対して、"release" メソッドは一度も呼び出されませんでした。`,
    );
  };
  #registry = new FinalizationRegistry(Thingy.#cleanup);
  #file;

  /**
   * 指定されたファイルに対して `Thingy` のインスタンスを作成します。
   * 使用が終わったら、必ず `release` を呼び出してください。
   *
   * @param filename The name of the file.
   */
  constructor(filename) {
    this.#file = File.open(filename);
    //                            vvvvv−−−−− 保持値
    this.#registry.register(this, label, this.#file);
    //          target −−−−−^^^^         ^^^^^^^^^^−−−−− unregister トークン
  }

  /**
   * この `Thingy` インスタンスが保持しているリソースを解放します。
   */
  release() {
    if (this.#file) {
      this.#registry.unregister(this.#file);
      //                        ^^^^^^^^^^−−−−− unregister トークン
      File.close(this.#file);
      this.#file = null;
    }
  }
}

仕様書

仕様書
ECMAScript® 2027 Language Specification
# sec-finalization-registry.prototype.unregister

ブラウザーの互換性

関連情報