JavaScript

FinalizationRegistry オブジェクト

 編集:2022.08.10 by T.A.

FinalizationRegistry オブジェクトにより、オブジェクトがガベージコレクションで回収されるときにコールバックを要求することができます。

解説

FinalizationRegistry は、レジストリーに登録されているオブジェクトが回収される(ガベージコレクションされる)時にクリーンアップ コールバックを要求する方法を提供します。(クリーンアップ コールバックはファイナライザーと呼ばれることもあります。)

Note: クリーンアップ コールバックは、重要なプログラムロジックには使用しないでください。詳細は、クリーンアップ コールバックに関する注意事項を参照してください。

コールバックで渡すレジストリーを作成します。

const registry = new FinalizationRegistry(heldValue => {
  // ....
});

次に、register メソッドを呼び出して、クリーンアップ コールバックを行いたいオブジェクトを登録し、そのオブジェクトと保持値を渡します。

registry.register(theObject, "some value");

レジストリーがオブジェクトへの強い参照を保持すると、目的に反してしまうので、(レジストリーが強い参照を保持していれば、そのオブジェクトは決して回収されない)、強い参照は保持はしません。

theObject が回収された場合、クリーンアップ コールバックは、指定した保持値(上記の "some value")で呼び出される可能性があります。保持値は、プリミティブでもオブジェクトでも、undefined であっても構いません。保持値がオブジェクトの場合、レジストリーはその値への強い参照を保持します(これにより、後でクリーンアップ コールバックに渡すことができます)。

オブジェクトの登録を解除したい場合は、三番目の値を渡します。これは、後でレジストリーのレジストリーの unregister 関数を呼び出してオブジェクトの登録を解除する際に使用する登録解除トークンです。レジストリーは、登録解除トークンへの弱い参照のみを保持します。

よくオブジェクト自身が登録解除トークンとして使われ、これは良い結果になります。

registry.register(theObject, "some value", theObject);
// ...some time later, if you don't care about `theObject` anymore...
registry.unregister(theObject);

ただし、同じオブジェクトである必要はありません。異なるものでも構いません。

registry.register(theObject, "some value", tokenObject);
// ...some time later, if you don't care about `theObject` anymore...
registry.unregister(tokenObject);
コンストラクター
FinalizationRegistry()
新しい FinalizationRegistry オブジェクトを生成します。
インスタンス メソッド
FinalizationRegistry.register()
オブジェクトをレジストリーに登録して、オブジェクトがガベージコレクションされたときにクリーンアップ コールバックが実行できるようにします。
FinalizationRegistry.unregister()
オブジェクトをレジストリーから登録解除します。
できるだけ使用しない

¶省く

新しいレジストリーの生成

コールバックを渡すことでレジストリーを作成することができます。

const registry = new FinalizationRegistry(heldValue => {
  // ....
});
クリーンアップのためにオブジェクトを登録

そして、クリーンアップ コールバックを呼び出す任意のオブジェクトを登録するには、register メソッドを呼び出して、そのオブジェクトと保持値を渡します。

registry.register(theObject, "some value");

テスト