知識のフロントエンド:JavaScriptの基礎 - スコープとクロージャ - 原理と閉鎖やスタックオーバーフローやメモリリークの原則と対応するソリューションの役割

原則とクロージャの役割

クロージャー:

変数関数スコープの他の機能にアクセスする権利。

閉鎖に一般的な方法を作成すると、別の関数に関数を作成することです。

パッケージは閉鎖されています。

アクセス内部変数関数は、関数はガベージコレクションを処理されません、環境に保管されています

関数内で宣言された変数がローカルであるため、それらは、関数の内部にアクセスすることができるが、外部変数の関数は、スコープチェーンの特徴である機能、内部見えます。

子供たちは、親の変数を調べるステップルックバイステップ、日付を見つけることができます

したがって、我々は、関数内で関数を作成することができますので、内部関数、外側の関数の変数が表示されていることを、我々は彼の変数にアクセスすることができます。

<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

https://www.cnblogs.com/shiyou00/p/10598010.html

https://www.jianshu.com/p/9fc2e3ee4efe

おすすめ

転載: www.cnblogs.com/memphis-f/p/12061036.html