プロが教える店舗&オフィスのセキュリティ対策術

お世話になります。クロージャ使用によるメモリリークについて、

function doHoge(element) {
 element.onClick = function() {
  // do domething
 }
}

でメモリリークが起こりますが、次の場合はどうなるでしょうか。

function doHoge() {
 var element = document.getElementById("aa");
 element.onClick = function() {
  // do domething
 }
}

あるサイトではdoHogeの引数のみに言及していましたが、この場合もクロージャはelementを参照するのでメモリリークが起こると思うのですが、
どうでしょうか。

よろしくお願いします。

A 回答 (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
    • good
    • 0
この回答へのお礼

ありがとうございます。リンク先拝見しました。

どうもメモリリークの原因は私が思っていたより複雑なようですね。
解決策もいちいちしてたらちょっと手間がかかりそうです。

お礼日時:2008/10/23 18:40

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 要素への参照を持っているわけではないので循環参照にはならないと考えられる。

==引用ここまで==

どうやらその場合は大丈夫そうです。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
そのサイトも見ましたが、それは今回のパターンとは違うものではないでしょうか。

> links が直接特定の a 要素への参照を持っているわけではない

とありますが、
var element = document.getElementById("aa");
element.onClick = function() {
}
の場合はelementが直接特定の要素への参照を持ってしまっています。

お礼日時:2008/10/23 17:53

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!