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

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

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

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

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


クロージャは、 element使用しない場合でも、 elementaおよびbへのポインタを保持します。 また、 elementにはクロージャーへのポインターも格納されているため、ガベージコレクターによってクリアされないループが取得されます。

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

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


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

Source: https://habr.com/ru/post/J146784/


All Articles