JavaScriptで別のオブジェクトへの「弱い参照」を作成する方法はありますか?これは、弱参照とは何かを説明するwikiページです。 これは、Javaでそれらを説明する別の記事です。この動作をJavaScriptで実装する方法を誰かが考えられますか?
10 に答える
更新: 2020 年 7 月以降、一部の実装 (Chrome、Edge、Firefox、および Node.js) は、2020 年 12 月 16 日の時点で「ステージ 3 ドラフト」であるWeakRefs 提案WeakRef
で定義されているように s をサポートしています。
JavaScript では、weakref の言語サポートはありません。手動の参照カウントを使用して自分でロールバックすることはできますが、特にスムーズではありません。プロキシ ラッパー オブジェクトを作成することはできません。JavaScript オブジェクトでは、いつガベージ コレクションが行われるかがわからないからです。
したがって、「弱い参照」は、参照の追加および参照の削除メソッドを使用した単純なルックアップのキー(整数など)になり、手動で追跡された参照がなくなったら、エントリを削除して、将来のルックアップを残しますnull を返すキー。
これは実際にはweakrefではありませんが、同じ問題のいくつかを解決できます。これは通常、複雑な Web アプリケーションで、DOM ノードまたはイベント ハンドラーとそれに関連付けられたオブジェクト (クロージャーなど) の間に参照ループがある場合に、ブラウザー (通常は IE、特に古いバージョン) からのメモリ リークを防ぐために行われます。このような場合、完全な参照カウント方式は必要ないかもしれません。
NodeJS で JS を実行する場合は、https://github.com/TooTallNate/node-weakを検討してください。
参考までに。JavaScript にはありませんが、ActionScript 3 (これも ECMAScript) にはあります。Dictionaryのコンストラクターパラメーターを確認してください。
真の弱参照、いいえ、まだです(ただし、ブラウザーメーカーはこの件名を検討しています)。しかし、ここに弱参照をシミュレートする方法についてのアイデアがあります。
オブジェクトを駆動するキャッシュを構築できます。オブジェクトが保存されると、キャッシュはオブジェクトが使用するメモリの量を予測し続けます。画像の保存など、一部のアイテムでは、これは簡単に解決できます。他の人にとっては、これはもっと難しいでしょう。
オブジェクトが必要な場合は、キャッシュにオブジェクトを要求します。キャッシュにオブジェクトがある場合は、それが返されます。そこにない場合は、アイテムが生成され、保存されてから返されます。
弱参照は、予測されるメモリの合計量が特定のレベルに達すると、アイテムを削除するキャッシュによってシミュレートされます。取得頻度に基づいて、どのアイテムが最も使用されていないかを予測し、どれくらい前に取り出されたかで重み付けします。アイテムを作成するコードがクロージャーとしてキャッシュに渡される場合、「計算」コストも追加される可能性があります。これにより、キャッシュは、構築または生成に非常に費用のかかるアイテムを保持できるようになります。
これを間違えると、最も人気のあるアイテムを削除してしまう可能性があるため、削除アルゴリズムが重要です。これはひどいパフォーマンスを引き起こすでしょう。
キャッシュが、格納されているオブジェクトへの永続的な参照を持つ唯一のオブジェクトである限り、上記のシステムは、真の弱参照の代わりとして非常にうまく機能するはずです。
http://www.jibbering.com/faq/faq_notes/closures.html
ECMAScriptは自動ガベージコレクションを使用します。仕様は詳細を定義しておらず、それを実装者に任せて整理します。一部の実装では、ガベージコレクション操作の優先度が非常に低いことが知られています。しかし、一般的な考え方は、オブジェクトが参照できなくなった場合(コードを実行するためにアクセス可能なままになっているオブジェクトへの参照が残っていないため)、ガベージコレクションに使用できるようになり、将来のある時点で破棄され、消費しているリソースが解放されて返されます。再利用のためにシステムに。
これは通常、実行コンテキストを終了するときに当てはまります。スコープチェーン構造、Activation / Variableオブジェクト、および実行コンテキスト内で作成されたオブジェクト(関数オブジェクトを含む)はアクセスできなくなり、ガベージコレクションに使用できるようになります。
つまり、弱いものはなく、利用できなくなったものだけです。