前回の記事でjsでのリサイクルの仕組みを説明しましたが、当時の私にとってリサイクルの仕組みの概念が少し理解できたので投稿します。記憶を要約して深めるための記事。
なぜリサイクルメカニズムがあるのですか?なぜ?
たとえば、このメモリ カードは 8G ですが、このメモリ カードにファイル、ビデオ、音楽を保存すると、必要に応じて保存できなくなります。このメモリカードに他のファイルを保存するには、いくつかのファイルを削除する必要がありますが、これらの削除されたファイルは、js での削除と同じです。
これらの問題は、これらのプログラミング言語でも発生します。そう、メモリです。宣言した変数はすべてメモリを消費し、変数の数が増えるほど実行が遅くなります。もちろん変数だけではなく、コード内のあらゆるものに適用されます。これらの問題を解決するために、これらの言語の設計者は一連のコード リサイクル ルールを設計しました。
コードの再利用ルールは次のとおりです:
1. グローバル変数は再利用されません。
2. ローカル変数はリサイクルされます。つまり、関数の実行が終了すると、関数内のすべてが破棄されます。
3. 別のスコープによって参照されている限り、リサイクルされません
これらを証明するためにいくつかの例を使用します。
function a(){ var user = "追梦子"; return user; } var b = a(); console.log(b); //追梦子
論理的には関数aの変数にはアクセスできませんが、関数aの戻り値はグローバル変数b経由で受け取っているので、最終的には以下のコードになりました。
function a(){ var user = "追梦子"; return user; } var b = "追梦子"; console.log(b);
これにはコードの再利用がないようなので、次のコードを見てみましょう。
function a(){ var num = 0; return function(){ num ++; console.log(num); }; } var b = a(); b(); //1 b(); //2 b(); //3
ほら、通常どおりに実行すると、出力は 3 回と 1 回になるはずです。これは、関数本体を実行すると、関数本体内のコードがクリアされるため、次にこのセクションを実行します。 time コードを記述するとき、num は 1 のままである必要がありますが、ここでの状況は少し異なります。関数内のローカル変数が別のスコープによって参照されている限り、このコードは破棄されません。
上記のコードは次のようになります
function a(){ var num = 0; return function(){ num ++; console.log(num); }; } var b = function(){ num ++; console.log(num); }; b(); b(); b();
その後、関数 a が返した無名関数のスコープが関数 a から window に移動します。この無名関数はグローバル変数 b で参照されているため、破棄されません。
function a(){ var num = 0; return function(){ num ++; console.log(num); }; } var b = { fn:a() } b.fn(); //1 b.fn(); //2 b.fn(); //3
同じことが当てはまります。匿名関数はオブジェクト b の属性 fn によって参照され、スコープが変更されるためです。簡単に言うと、関数またはローカル変数のスコープが変更される限り、関数またはローカル変数は変更されません。破壊されました。
以上がこの記事の全内容です。js リサイクルの仕組みについて少しでもお役に立てれば幸いです。