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

クロージャはどのようにしてメモリリークを引き起こし、それを防ぐ方法はありますか?


閉鎖

javascriptの強みの1つは、クロージャです。 Javascriptを使用すると、関数内の関数であるネストされた関数が親関数の変数にアクセスできます。内部関数によって外部関数の変数にアクセスするこのプロセスは、クロージャと呼ばれます。宣言された変数が内部のネストされた関数で自動的に使用可能になり、内部のネストされた関数で参照されていないにもかかわらずメモリ内に存在する場合、メモリリークが発生します。

次の例では、「childFunction」は「parentFunction」内で定義された内部関数であり、外部関数です。パラメータ「outerval」を使用して「parentFunction」を呼び出すと、外部変数aに「outerval」の値が割り当てられます。この関数は、内部関数「childFunction」へのポインタを返します。これは、変数'val'。

外部関数が返された場合でも、外部関数のローカル変数aは引き続き存在します。 javascriptでは、parentFunctionが呼び出されると、プロパティ'a'を持つスコープオブジェクトが作成されます。このプロパティには、「outerval」とも呼ばれるarg1の値が含まれています。同様に、parentFunctionが戻ると、変数valに含まれている内部関数(childFunction)が返されます。

内部関数は外部関数の変数への参照を保持しているため、プロパティ'a'を持つスコープオブジェクトはガベージコレクションされません。

<html>
<body>
<script>
   window.onload= function parentFunction(arg1) {
      var a = arg1;
      return function childFunction (arg2)
   {
      alert( a +" "+ arg2);
   };
   };
   var val = parentFunction("outer val");
   val("inner val");
</script>
</body>
</html>

メモリリークの回避

もう1つの機能を追加する

別の関数を追加することにより、2つの内部関数があります。内部関数は2つあるため、クロージャを完全に停止して外部関数の変数を参照できる関数はありません。

クロージャがない場合、メモリリークの可能性は低くなります。

<html>
<body>
<script>
   window.onload=function parentFunction(){
      var Obj1 = function childFunction1()
      {
         document.write("the leak is avoided");
      };
   (function childFunction2(){
      var obj2 = document.getElementById("closure");
      obj2.onclick=Obj1
      })();
   };
</script>
<input type = "button" id="closure" value ="Click Here">
</body>
</html>

コードが実行されると、ボタンが次のように表示されます

クロージャはどのようにしてメモリリークを引き起こし、それを防ぐ方法はありますか?

ボタンを押すと、次のような出力が得られます

出力

the leak is avoided

  1. DNS リークとその防止方法

    インターネット接続へのリモート アクセスの使用が増加しているため、ハッキングの試みはますます巧妙になっています。公衆 Wi-Fi 接続の存在は、インターネット サービス プロバイダー (ISP) が提供する接続に深刻な脆弱性をもたらしました。さらに、パーソナル コンピューターや企業ネットワークに対するサイバー攻撃やランサムウェア攻撃の増加により、サイバー空間に保存されているデータの機密性とセキュリティが問題になっています。 そして今、ハッカーやサイバー攻撃者がシステムにアクセスする必要はありません。彼らができることは、インターネット ネットワークを侵害し、最終的に悪意のある Web サイトに

  2. スパイウェアとアドウェアを防ぐには?

    スパイウェアやアドウェアのないコンピュータを持つことは、個人にとっての必要性と責任になりました。サイバー犯罪者は日を追うごとに賢くなり、ウイルス、キーロガー、スパイウェア、アドウェア、悪意のあるリンクを偽装して送信し、機密情報を手に入れて金銭的利益を得るなど、システムを標的にする新しい方法を発明しています。幸いなことに、いくつかの手順に従うことで、スパイウェアやアドウェアがシステムに感染するのを防ぐことができます。しかし先に進む前に、スパイウェアとアドウェアとは何かを理解しましょう? スパイウェアとは? スパイウェアは、攻撃者が知らないうちにユーザーのコンピューターを攻撃するように設計された