Javascript
 Computer >> コンピューター >  >> プログラミング >> Javascript

循環参照はJavaScriptでどのようにメモリリークを引き起こす可能性がありますか?


循環参照

循環参照は、2つの変数が各オブジェクトに1の参照カウントを与えることによって相互に参照するときに形成されます。純粋なガベージコレクションシステムでは、関連する変数に参照がない場合、循環参照は問題にならない可能性があります。そのシナリオでは、宣言された変数はガベージコレクションされます。参照カウントシステムでは、参照カウントをゼロにすることはできないため、どちらのオブジェクトも破棄されません。

参照カウントとガベージコレクションが使用されるハイブリッドシステムでは、システムが循環参照を識別できないため、メモリリークが発生します。

次の例は、javascriptオブジェクトとDOMオブジェクト間の循環参照を示しています。javascriptオブジェクトはDOMオブジェクト(Div)への参照を持ち、Domオブジェクト(Div)は「expando」プロパティを介してjavascriptオブジェクト(obj)への参照を持ちます。両方のオブジェクトが相互に参照されているため、メモリリークが発生してオブジェクトが破壊されることはありません。

<html>
<body>
<script>  
   window.onload = function(){
   var obj=document.getElementById("DivElement");
   document.getElementById("DivElement").expandoProperty=obj;
   obj.String=new Array(1000).join(new Array(2000);
   };
</script>
</body>
</html>

メモリリークの回避

次の例では、最初はjavascriptオブジェクトとDOMオブジェクトの両方が循環参照されていますが、nullがjavascriptオブジェクトに割り当てられると、両方のオブジェクト(javascriptオブジェクトとDOMオブジェクト)がジレンマになり、どちらを参照しているか、つまりjavascriptオブジェクトが参照しているかどうかがわかります。 nullまたは循環参照を壊してそこにあるDOMオブジェクト。

<html>
<body>
<script>  
   window.onload = function(){
   var obj=document.getElementById("DivElement");
   document.getElementById("DivElement").expandoProperty=obj;
   obj.String=new Array(1000).join(new Array(2000);
   obj = null        // this breaks circular reference
   };
</script>
</body>
</html>

  1. JavaScriptでインポートされたオブジェクトを非構造化するにはどうすればよいですか?

    以下は、JavaScriptでインポートされたオブジェクトを非構造化するコードです- 例 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Document</title> <style&g

  2. 多次元JavaScriptオブジェクトを作成するにはどうすればよいですか?

    以下は、多次元JavaScriptオブジェクトを作成するためのコードです- 例 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Document</title> <style> &n