JavaScriptで別のオブジェクトへの「弱い参照」を作成する方法はありますか?弱い参照とは何かを説明したwikiページです。 Javaでそれらを説明する別の記事を次に示します。誰もがこの動作をJavaScriptで実装する方法を考えることができますか?
JavaScriptで別のオブジェクトへの「弱い参照」を作成する方法はありますか?弱い参照とは何かを説明したwikiページです。 Javaでそれらを説明する別の記事を次に示します。誰もがこの動作をJavaScriptで実装する方法を考えることができますか?
回答:
JavaScriptのweakrefの言語サポートはありません。手動の参照カウントを使用して独自にローリングできますが、特にスムーズに行うことはできません。JavaScriptオブジェクトでは、ガベージコレクションのタイミングがわからないため、プロキシラッパーオブジェクトを作成することはできません。
したがって、「弱い参照」は、add-referenceメソッドとremove-referenceメソッドを使用した単純なルックアップのキー(例:整数)になり、手動で追跡される参照がなくなった場合、エントリを削除して、今後のルックアップを残すことができます。 nullを返すキー。
これは実際には弱参照ではありませんが、同じ問題のいくつかを解決できます。DOMノードまたはイベントハンドラーとクロージャーなどのそれに関連付けられたオブジェクトの間に参照ループがある場合、ブラウザー(通常はIE、特に古いバージョン)からのメモリリークを防ぐために、通常は複雑なWebアプリケーションで行われます。これらの場合、完全な参照カウントスキームは必要ないかもしれません。
NodeJSでJSを実行するときは、https://github.com/TooTallNate/node-weakを検討してください。
まだ弱い参照を使用することはできませんが、JavaScriptのWeakRefが作業中のため、おそらくすぐに使用できるようになります。詳細は以下。
提案は現在ステージ3にあります。つまり、完全な仕様があり、さらに改良するには実装とユーザーからのフィードバックが必要です。
WeakRefの提案は、機能の二つの主要な新しい作品を包含する。
主な用途弱参照のためには、それはキャッシュやマッピングに表示されますので、大きなオブジェクトを単独で生かされていないことが望ましいのWHERE、大きなオブジェクトを保持するキャッシュやマッピングを実装することです。
ファイナライズとは、プログラムの実行に到達できなくなったオブジェクトの後にクリーンアップするコードを実行することです。ユーザー定義のファイナライザは、いくつかの新しい使用例を可能にし、ガベージコレクタが認識していないリソースを管理する際のメモリリークの防止に役立ちます。
https://github.com/tc39/proposal-weakrefs
https://v8.dev/features/weak-references
真の弱い参照、いいえ、まだです(ただし、ブラウザメーカーはこの問題を検討しています)。しかし、これは弱参照をシミュレートする方法に関するアイデアです。
オブジェクトをドライブするキャッシュを構築できます。オブジェクトが格納されると、キャッシュはオブジェクトが使用するメモリ量の予測を保持します。画像の保存など一部のアイテムでは、これは簡単に解決できます。他の人にとって、これはもっと難しいでしょう。
オブジェクトが必要なときは、キャッシュにそれを要求します。キャッシュにオブジェクトがある場合は、それが返されます。存在しない場合は、アイテムが生成、保存されてから返されます。
予測メモリの総量が特定のレベルに達すると、アイテムを削除するキャッシュによって弱参照がシミュレートされます。アイテムが取り出された頻度に基づいて、アイテムが取得された頻度に基づいて、最も使用されていないアイテムを予測します。アイテムを作成するコードがクロージャーとしてキャッシュに渡される場合、「計算」コストも追加される可能性があります。これにより、構築または生成に非常にコストのかかるアイテムをキャッシュが保持できるようになります。
これを間違えると、最も人気のあるアイテムを削除してしまう可能性があるため、削除アルゴリズムは重要です。これはひどいパフォーマンスを引き起こします。
キャッシュが、保存されたオブジェクトへの永続的な参照を持つ唯一のオブジェクトである限り、上記のシステムは、真の弱い参照の代替としてかなりうまく機能するはずです。
参考までに; JavaScriptにはありませんが、ActionScript 3(ECMAScriptでもあります)にはあります。Dictionaryのコンストラクタパラメータを確認してください。
JL235が上記で提案したように、キャッシングメカニズムを使用して弱い参照をエミュレートすることは合理的です。弱参照がネイティブに存在する場合、次のような動作が見られます。
this.val = {};
this.ref = new WeakReference(this.val);
...
this.ref.get(); // always returns val
...
this.val = null; // no more references
...
this.ref.get(); // may still return val, depending on already gc'd or not
一方、キャッシュを使用すると、次のことがわかります。
this.val = {};
this.key = cache.put(this.val);
...
cache.get(this.key); // returns val, until evicted by other cache puts
...
this.val = null; // no more references
...
cache.get(this.key); // returns val, until evicted by other cache puts
参照の保持者として、値を参照するときについて何も仮定しないでください。これは、キャッシュを使用しても違いはありません。
最後に彼らはここにいます。ブラウザーにはまだ実装されていませんが、まもなく実装されます。
EcmaScript 6(ES Harmony)にはWeakMapオブジェクトがあります。最新のブラウザーでのブラウザーのサポートはかなり良好です(Firefoxの最後の3つのバージョン、クロム、および今後のIEバージョンでさえサポートされています)。
WeakMap
はオブジェクトへの弱参照を与えません-WeakMapで弱参照であるのは値ではなく、キーです。弱い参照がマップに存在するという事実は、メモリリークを防止するメカニズムにすぎず、それ以外の場合はユーザーが監視できません。
weakmap.get(new String('any possible key that has ever existed or ever will exist'))
になる常にあることをundefined
。 役に立たない。反対投票!
http://www.jibbering.com/faq/faq_notes/closures.html
ECMAScriptは自動ガベージコレクションを使用します。仕様では詳細が定義されておらず、実装者が整理する必要があります。一部の実装では、ガベージコレクション操作の優先度が非常に低いことが知られています。しかし、一般的な考え方は、オブジェクトが(コードの実行にアクセス可能なままにされたままの参照がなくなることによって)参照できなくなると、ガベージコレクションに使用できるようになり、ある時点で破棄され、消費しているリソースが解放されて返されるということです。システムに再利用します。
これは通常、実行コンテキストを終了するときに当てはまります。スコープチェーン構造、アクティベーション/変数オブジェクト、および実行コンテキスト内で作成されたオブジェクト(関数オブジェクトを含む)はアクセスできなくなり、ガベージコレクションに使用できるようになります。
弱いものはなく、もはや利用できなくなったものだけを意味します。