HTML: Markup language
CSS: Styling language
JavaScript: Scripting language
Web APIs: Programming interfaces
All web technology
Learn web development
Discover our tools
Get to know MDN better
このページはコミュニティーの尽力で英語から翻訳されました。MDN Web Docs コミュニティーについてもっと知り、仲間になるにはこちらから。
View in English Always switch to English
This feature is well established and works across many devices and browser versions. It’s been available across browsers since 2021年4月.
* Some parts of this feature may have varying levels of support.
FinalizationRegistry オブジェクトにより、オブジェクトがガベージコレクションで回収されるときにコールバックを要求することができます。
FinalizationRegistry
FinalizationRegistry は、レジストリーに登録されているオブジェクトが回収される (ガベージコレクションされる) 時にクリーンアップコールバックを要求する方法を提供します。(クリーンアップコールバックはファイナライザーと呼ばれることもあります。)
メモ: クリーンアップコールバックは、重要なプログラムロジックには使用しないでください。詳細は、クリーンアップコールバックに関する注意事項を参照してください。
コールバックで渡すレジストリーを作成します。
const registry = new FinalizationRegistry((heldValue) => { // .... });
次に、 register メソッドを呼び出して、クリーンアップコールバックを行いたいオブジェクトを登録し、そのオブジェクトと保持値を渡します。
register
registry.register(theObject, "some value");
レジストリーがオブジェクトへの強い参照を保持すると、目的に反してしまうので、 (レジストリーが強い参照を保持していれば、そのオブジェクトは決して回収されない)、強い参照は保持はしません。
theObject が回収された場合、クリーンアップコールバックは、指定した保持値 (上記の "some value") で呼び出される可能性があります。保持値は、プリミティブでもオブジェクトでも、 undefined であっても構いません。保持値がオブジェクトの場合、レジストリーはその値への強い参照を保持します (これにより、後でクリーンアップコールバックに渡すことができます)。
theObject
"some value"
undefined
オブジェクトの登録を解除したい場合は、三番目の値を渡します。 これは、後でレジストリのレジストリの unregister 関数を呼び出してオブジェクトの登録を解除する際に使用する登録解除トークンです。レジストリーは、登録解除トークンへの弱い参照のみを保持します。
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.prototype.register()
オブジェクトをレジストリーに登録して、オブジェクトがガベージコレクションされたときにクリーンアップコールバックが実行できるようにします。
FinalizationRegistry.prototype.unregister()
オブジェクトをレジストリーから登録解除します。
FinalizationRegistry を正しく使用するには慎重に検討する必要があるため、できるだけ使用しない方がいいでしょう。また、仕様で保証されていない特定の動作に依存しないようにすることも重要です。ガベージコレクションがいつ、どのように、どのように行われるかは、それぞれの JavaScript エンジンの実装に依存します。あるエンジンで観察された動作が、別のエンジンや同じエンジンの別のバージョンでは異なるかもしれませんし、同じエンジンの同じバージョンでも若干異なる状況になるかもしれません。ガベージコレクションは、 JavaScript エンジンの実装者がその解決策を常に改良し続けている難しい問題なのです。
ここでは、 FinalizationRegistry が含まれている WeakRef の提案の著者が、その説明文書に盛り込んだ具体的なポイントを紹介します。
ガベージコレクター は複雑です。アプリケーションやライブラリーが、ガベージコレクターによる FinalizationRegistry のクリーンアップやファイナライザー [クリーンアップコールバック] の呼び出しをタイムリーに予測可能な方法で行うことに依存している場合、期待を裏切られる可能性があります。クリーンアップが予想よりもずっと遅く行われたり、まったく行われなかったりすることがあります。変化する原因には次のようなものがあります。 あるオブジェクトが他のオブジェクトよりも早くガベージコレクションされることがあります。これは、世代別コレクションなどにより、同時に到達できなくなったとしても同様です。 ガベージコレクションの作業は、差分技術やコンカレント技術を使って時間をかけて分割される可能性があります。 メモリ使用量や応答性のバランスをとるために、さまざまなランタイムヒューリスティックが使用されることがあります。 JavaScript エンジンは、 (クロージャやインラインキャッシュなどで) 到達できないように見えるものへの参照を保持することがあります。 JavaScript エンジンによっては、これらの処理が異なる場合がありますし、同じエンジンでもバージョンによってアルゴリズムが変わる場合があります。 複雑な要因により、特定の API を使用する場合などに、オブジェクトが予想外の時間だけ保持されることがあります。
ガベージコレクター は複雑です。アプリケーションやライブラリーが、ガベージコレクターによる FinalizationRegistry のクリーンアップやファイナライザー [クリーンアップコールバック] の呼び出しをタイムリーに予測可能な方法で行うことに依存している場合、期待を裏切られる可能性があります。クリーンアップが予想よりもずっと遅く行われたり、まったく行われなかったりすることがあります。変化する原因には次のようなものがあります。
クリーンアップコールバックには、いくつかの注意点があります。
コールバックを渡すことでレジストリーを作成することができます。
そして、クリーンアップコールバックを呼び出す任意のオブジェクトを登録するには、 register メソッドを呼び出して、そのオブジェクトと保持値を渡します。
Enable JavaScript to view this browser compatibility table.
WeakRef
WeakSet
WeakMap