jsクロージャとは何ですか

定義: クロージャは、他の関数内の変数を読み取ることができる関数です。JavaScript では、関数内のサブ関数のみがローカル変数を読み取ることができるため、クロージャは「関数内で定義された関数」として理解できます。本質的に、クロージャは関数の内部と関数の外部を接続するブリッジです。(クロージャの最も一般的なアプリケーションは、コールバック関数(callback) を実装することです)。

クロージャインスタンス

function foo(a) {
  var b = a + 1;
  function bar(c) {
    console.log(a, b, c);
  }
  return bar;
}
let result = foo(1);
result(3);
//控制台打印1,2,3

上の例からわかります。関数 bar は関数 foo にネストされており、foo を実行すると bar 関数が返され、その後 foo を呼び出した結果を実行すると実際に bar が実行され、最後に bar 関数が実行されて 123 が出力されます。

実際、関数 foo の外側の変数 result が関数 foo 内の関数 bar を参照するため、上記の例では実際にクロージャが作成されます。つまり、関数 foo の内部関数 bar が関数 foo の外部の変数によって参照されると、クロージャが作成されます。

クロージャーの用途は何ですか?

つまり、クロージャの機能は、foo が実行を終了して戻った後、foo の内部関数 bar の実行が foo 内の変数に依存するため、JavaScript のガベージ コレクション メカニズムが foo によって占有されていたリソースを回復するのをクロージャが阻止することです。 

上記の例では、クロージャの存在により、関数 foo が戻った後、bar の c が常に存在するため、result(3) が実行されるたびに、関数 bar は 3 を受け入れ、a、b、c を出力します。

次に、別の状況を想像してみましょう。foo が関数バーを返さない場合、状況はまったく異なります。foo 実行後、bar は foo の外に戻されず、foo からのみ参照されるため、このとき foo は foo からのみ参照されるため、関数 a と関数 b は相互に参照しますが妨げられません。外部の世界 (外部の世界から参照される) によって、関数 foo と bar がリサイクルされます。

応用シナリオ

  1. 関数内の変数にアクセスする

  1. 変数をメモリ内に保持する

クロージャのデメリットと解決策

  • 関数実行後、関数内のローカル変数が解放されず、メモリ使用時間が長くなります。

  • メモリリークが起こりやすい

解決

使用できる場合は使用しない、または使用して null に設定する

おすすめ

転載: blog.csdn.net/weixin_56661658/article/details/128749434