原則とクロージャの役割
クロージャー:
変数関数スコープの他の機能にアクセスする権利。
閉鎖に一般的な方法を作成すると、別の関数に関数を作成することです。
パッケージは閉鎖されています。
アクセス内部変数関数は、関数はガベージコレクションを処理されません、環境に保管されています
関数内で宣言された変数がローカルであるため、それらは、関数の内部にアクセスすることができるが、外部変数の関数は、スコープチェーンの特徴である機能、内部見えます。
子供たちは、親の変数を調べるステップルックバイステップ、日付を見つけることができます
したがって、我々は、関数内で関数を作成することができますので、内部関数、外側の関数の変数が表示されていることを、我々は彼の変数にアクセスすることができます。
<SCRIPT> 関数 バー(){ // 外側の関数宣言変数 VARの値= 1 ; 関数のfoo(){ にconsole.log(値); } 戻りのfoo(); }; VARの BAR2、= バール; // 事実実行がガベージコレクションのメカニズムのうちに処理されたため、バー()関数が完了していない // 変数これらのクロージャの役割である、関数fooを実行しますコール・バー()関数は、fooが、あなたは外側の層にアクセスする必要があります BAR2、(); </ SCRIPT>
FOO()クロージャのスコープ内のバー()、その範囲は、ガベージコレクションを処分しない、生き残ることができましたことを、これはいつでも参照fooの閉鎖の役割は、()であるを含みます。
クロージャパッケージの利点:
- 簡単に呼び出し、ローカル変数はの文脈の中で宣言しました
- ロジック密接に、あなたはその後、パラメータの受け渡しの問題を回避するために、関数内で関数を作成することができます
クロージャパッケージ短所:
クロージャの使用は、機能を実行した後に破棄することはできませんので、クロージャ多数のメモリリーク、メモリ消費量の大きなの使用になりますと、それは、メモリ内に残っています
要約:
クロージャは、変数が保持された物体の閉鎖の範囲外であるため、変数は、それが作成された環境を残している場合でも、外部変数の機能にアクセスすることができます。この機能は、ネストされた関数の間で閉鎖の暗黙的なデータ転送を実現しています。
クロージャーアプリケーション:
関数addFn(B){ リターン(関数(){ にconsole.log( + "+" + B) }) } VARのテスト= addFn(B) setTimeout(試験、 3000)。
最初のパラメータは、一般的にsetTimeoutメソッドの機能ではなく、伝統的な価値観です。あなたはそれに値を渡したい場合は、内部関数の呼び出しを返すように関数を呼び出すことができ、setTimeoutメソッドに渡された内部関数を呼び出します。setTimeout関数では、彼に必要な機能パラメータの内部、外部関数を実行する外部関数にすることができ、アクセス。
スタックオーバーフローやメモリは原則リークします:
1、メモリリークは:アプリケーションの実行がタイムリーにアップクリーンかの破壊ではありません後、空きメモリを占有し、メモリを指し、メモリリークがあまりにも多く、それはプログラムの背面につながるメモリの対象とはなりません。したがって、メモリリークは、内部メモリのオーバーフローをもたらし得ます
図2に示すように、スタックオーバーフロー:十分なメモリが提供しないある、完成されたアプリケーションのメモリ空間を指し
図3は、いくつかのプログラミングソフトウェアでは、C言語など、私たちはその後、メモリ領域を割り当てる手動でクリアオフ無料のリリースを使用するmalloc関数を使用する必要があります。jsが独自のガベージコレクション、ごみ収集方法一般的に使用されるマーカーがクリアされています。
クリア標識法:実行環境に変数の後に、それにマークを追加します。環境への変数を、環境中に放出されることはありません、限り、環境の応答への「実行フロー」として、それらを使用することが可能です。環境変数を出た後、「環境を残す。」とマークされています
4、メモリリークの一般的な原因:
- グローバル変数によって引き起こされるメモリリーク
- クロージャ
- タイマーをクリアしていません
5. ソリューション:
- 不要なグローバル変数を減らします
- クロージャの使用を削減(閉鎖に起因するメモリリークにつながります)
- 無限ループの発生を回避するために、
参考記事:
https://blog.csdn.net/alegria_x/article/details/99539024