JavaScript と DOM の間で循環参照が作成されるため、 IE 6 および 7 (および非常に古いバージョンの FF) でリークします。IE 6 および 7 は、2 つのワールド間で循環参照を持つオブジェクトをガベージ コレクションできません。これは、別々のガベージ コレクタを使用するためです。
最新のブラウザーは、リークすることなくこれを処理できます。
IE 6 および 7 でのリークを防ぐには、作業が完了したら次のようにしますimg
。
img.onload = null;
最新のブラウザーのみを気にする場合は、心配する必要はありません。(IE 6 と 7 の市場シェアが最終的に十分に低くなったことをとても嬉しく思います!)
アップデート
割り当てた関数onload
はクロージャを作成します。そのクロージャには への参照が含まれていますimg
。img
そのクロージャが JScript のメモリに存在する限り、DOM のメモリからガベージ コレクションすることはできません (JScript は JavaScript の IE 実装の名前です)。同様に、関数への参照があるimg
ため、DOM のメモリに存在する限り、JScript のメモリからクロージャをガベージ コレクションすることはできません。img.onload
これは循環参照です。言い換えれば、drawImages
一度実行されたからといって、それが再び実行されないというわけではありません (JScript エンジンはonload
DOM のドメインである 1 回だけ起動することを認識していません)。
あなたが示したパターンは、IE 6 および 7 でメモリ リークを引き起こすことが知られている古典的なパターンです。(1) DOM ノード、(2) クロージャーを作成するその DOM ノード上のイベント ハンドラー、および (3) で構成されます。 ) クロージャー内のその DOM ノードへの参照。