クロージャを意味

実際に関数のクロージャが高い変数のスコープ、関数、クロージャをキャプチャするために、閉鎖に伴い、誰関数の参照は、破壊されません。

function test() {
  var data = new Array(100000); var getData = function(){return data;}; setTimeout(getData, 10000); }

機能が実行された後、一般的に、関数内で作成されたローカル変数は、それが自動的に破壊される。実施例は、すべてのテスト機能を実行し、上部のgetDataスコープデータ変数への参照が存在しない場合、それは、データのデータを作成します、テスト実行機能の終了時にデータが、それが破壊されます。それが作成されたときのgetDataは、それはその後、上側の可変ドメインの役割への参照を格納するための特別なコンテナを作成します。いわば、閉鎖のgetData関数は、外部データの取り込み変数への参照を作成します。これは、テストの実行後に理由、のgetData変数関数に立って、それはまた、破棄されます。そして、彼はいないのsetTimeoutの言葉の背後にある場合、でした。setTimeoutはのgetData関数への参照を保持しており、閉鎖のgetDataが形成され、捕捉され、常に存在するデータ変数参照、データしたがってデータおよびテスト機能の終了後直ちに破壊されないからです。setTimeoutは、トップの変数を撮影し、その後、閉鎖のgetDataフォームも破壊され得ることができ、もはや10秒後のgetData機能を指す参照変数ではないこと、関数参照を解放することができ、のgetData関数は指さ10秒後に実行されますそれがリリースされました。たとえばだから、のgetData閉鎖を破壊した後、10Sに形成されています。

なぜメモリはそれをリークしていますか?

そして、のgetData関数がしたsetIntervalで引用されている、あなたは例のsetIntervalとsetTimeoutを使用していない場合を想像しますが、のgetDataが撮影して形成され閉鎖やクロージャは、変数を使ってclearIntervalまで存在します。あなたはクリアすることを忘れ、または誤って再生し、複数のタイマーが、それは最後のものだけがクリアされていないわかっている場合は、メモリリークが発生していました。

要するに、限りも形成機能への参照を保存します誰も、この関数と関数クロージャとして一緒に破壊されます。

 

出典ます。https://segmentfault.com/q/1010000016554258/a-1020000016557945

おすすめ

転載: www.cnblogs.com/Alon-Td/p/12080575.html