--- title: FinalizationRegistry slug: Web/JavaScript/Reference/Global_Objects/FinalizationRegistry tags: - Class - FinalizationRegistry - JavaScript - Reference browser-compat: javascript.builtins.FinalizationRegistry translation_of: Web/JavaScript/Reference/Global_Objects/FinalizationRegistry --- {{JSRef}} **`FinalizationRegistry`** オブジェクトにより、オブジェクトがガベージコレクションで回収されるときにコールバックを要求することができます。 ## 解説 `FinalizationRegistry` は、レジストリーに登録されているオブジェクトが*回収*される (ガベージコレクションされる) 時に*クリーンアップコールバック*を要求する方法を提供します。(クリーンアップコールバックは*ファイナライザー*と呼ばれることもあります。)
> **Note:** クリーンアップコールバックは、重要なプログラムロジックには使用しないでください。詳細は、[クリーンアップコールバックに関する注意事項](#notes_on_cleanup_callbacks)を参照してください。 コールバックで渡すレジストリーを作成します。 ```js const registry = new FinalizationRegistry(heldValue => { // .... }); ``` 次に、 `register` メソッドを呼び出して、クリーンアップコールバックを行いたいオブジェクトを登録し、そのオブジェクトと*保持値*を渡します。 ```js registry.register(theObject, "some value"); ``` レジストリーがオブジェクトへの強い参照を保持すると、目的に反してしまうので、 (レジストリーが強い参照を保持していれば、そのオブジェクトは決して回収されない)、強い参照は保持はしません。 `theObject` が回収された場合、クリーンアップコールバックは、指定した*保持値* (上記の `"some value"`) で呼び出される可能性があります。保持値は、プリミティブでもオブジェクトでも、 `undefined` であっても構いません。保持値がオブジェクトの場合、レジストリーはその値への*強い*参照を保持します (これにより、後でクリーンアップコールバックに渡すことができます)。 オブジェクトの登録を解除したい場合は、三番目の値を渡します。 これは、後でレジストリのレジストリの `unregister` 関数を呼び出してオブジェクトの登録を解除する際に使用する*登録解除トークン*です。レジストリーは、登録解除トークンへの弱い参照のみを保持します。 よくオブジェクト自身が登録解除トークンとして使われ、これは良い結果になります。 ```js registry.register(theObject, "some value", theObject); // ...some time later, if you don't care about `theObject` anymore... registry.unregister(theObject); ``` ただし、同じオブジェクトである必要はありません。異なるものでも構いません。 ```js registry.register(theObject, "some value", tokenObject); // ...some time later, if you don't care about `theObject` anymore... registry.unregister(tokenObject); ``` ## コンストラクター - {{jsxref("FinalizationRegistry/FinalizationRegistry", "FinalizationRegistry()")}} - : 新しい `FinalizationRegistry` オブジェクトを生成します。 ## インスタンスメソッド - {{jsxref("FinalizationRegistry.register", "FinalizationRegistry.prototype.register()")}} - : オブジェクトをレジストリーに登録して、オブジェクトがガベージコレクションされたときにクリーンアップコールバックが実行できるようにします。 - {{jsxref("FinalizationRegistry.unregister", "FinalizationRegistry.prototype.unregister()")}} - : オブジェクトをレジストリーから登録解除します。 ## できるだけ使用しない `FinalizationRegistry` を正しく使用するには慎重に検討する必要があるため、できるだけ使用しない方がいいでしょう。また、仕様で保証されていない特定の動作に依存しないようにすることも重要です。ガベージコレクションがいつ、どのように、どのように行われるかは、それぞれの JavaScript エンジンの実装に依存します。あるエンジンで観察された動作が、別のエンジンや同じエンジンの別のバージョンでは異なるかもしれませんし、同じエンジンの同じバージョンでも若干異なる状況になるかもしれません。ガベージコレクションは、 JavaScript エンジンの実装者がその解決策を常に改良し続けている難しい問題なのです。 ここでは、 `FinalizationRegistry` が含まれている WeakRef の提案の著者が、その[説明文書](https://github.com/tc39/proposal-weakrefs/blob/master/reference.md)に盛り込んだ具体的なポイントを紹介します。 > [ガベージコレクター](