クロージャーを作成する機能は、おそらく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のメモリリークの最も一般的な例のようです。