- ベストアンサー
メモリリークに関して
お世話になります。クロージャ使用によるメモリリークについて、 function doHoge(element) { element.onClick = function() { // do domething } } でメモリリークが起こりますが、次の場合はどうなるでしょうか。 function doHoge() { var element = document.getElementById("aa"); element.onClick = function() { // do domething } } あるサイトではdoHogeの引数のみに言及していましたが、この場合もクロージャはelementを参照するのでメモリリークが起こると思うのですが、 どうでしょうか。 よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
[IEのメモリリーク - zorioの日記] http://d.hatena.ne.jp/zorio/20060316/1142528060 ↑によるとActivationオブジェクト経由で循環参照してしまうみたいですね。 たぶんこれで回避できる? [IE6のメモリリークを華麗に回避 - zorioの日記] http://d.hatena.ne.jp/zorio/20080609/1213028969 でもIEのメモリリークはもう直っているという話もある。 [IEのメモリリークが直ってるっぽい。 - zorioの日記] http://d.hatena.ne.jp/zorio/20070626/1182875782 条件によってはやっぱりだめみたいですが。 [やっぱりIEのメモリリークは直ってなかった - zorioの日記] http://d.hatena.ne.jp/zorio/20070918/1190135017
その他の回答 (1)
IEの問題ですよね? でしたらこちらが詳しいです。 http://nanto.asablo.jp/blog/2005/12/04/165848 ==引用== なお、一見メモリリークを引き起こしそうだが実はそうでないパターンもある。以下の例がそうだ。 function addActions() { var links = document.getElementsByTagName("a"); for (var i = 0; i < links.length; i++) links[i].onclick = function () { alert("Hello!"); }; } クロージャが a 要素全体への参照を持っているように思えるが、links の内容は動的 (あとから a 要素が追加 / 削除された場合、それは links にも反映される) であり、links が直接特定の a 要素への参照を持っているわけではないので循環参照にはならないと考えられる。 ==引用ここまで== どうやらその場合は大丈夫そうです。
お礼
回答ありがとうございます。 そのサイトも見ましたが、それは今回のパターンとは違うものではないでしょうか。 > links が直接特定の a 要素への参照を持っているわけではない とありますが、 var element = document.getElementById("aa"); element.onClick = function() { } の場合はelementが直接特定の要素への参照を持ってしまっています。
お礼
ありがとうございます。リンク先拝見しました。 どうもメモリリークの原因は私が思っていたより複雑なようですね。 解決策もいちいちしてたらちょっと手間がかかりそうです。