JavaScriptクロージャーでのメモリリーク

Google JavaScriptスタイルガイドからの引用:



クロージャーを作成する機能は、おそらくJSの最も便利で見過ごされがちな機能です。



ただし、心に留めておくべきことが1つあります。クロージャは、クローズするコンテキストへのポインタを格納します。 その結果、クロージャーをDOM要素にアタッチすると、循環依存が発生し、その結果、メモリリークが発生する可能性があります。 たとえば、次のコードでは:



function foo(element, a, b) { element.onclick = function() { /*  a  b */ }; }
      
      







クロージャは、 element



使用しない場合でも、 element



a



およびb



へのポインタを保持します。 また、 element



にはクロージャーへのポインターも格納されているため、ガベージコレクターによってクリアされないループが取得されます。



このような場合、コードは次のように構成する必要があります。



 function foo(element, a, b) { element.onclick = bar(a, b); } function bar(a, b) { return function() { /*  a  b */ } }
      
      







これは、現時点でJavaScriptのメモリリークの最も一般的な例のようです。



All Articles