
お世話になります。クロージャ使用によるメモリリークについて、
function doHoge(element) {
element.onClick = function() {
// do domething
}
}
でメモリリークが起こりますが、次の場合はどうなるでしょうか。
function doHoge() {
var element = document.getElementById("aa");
element.onClick = function() {
// do domething
}
}
あるサイトではdoHogeの引数のみに言及していましたが、この場合もクロージャはelementを参照するのでメモリリークが起こると思うのですが、
どうでしょうか。
よろしくお願いします。
No.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
ありがとうございます。リンク先拝見しました。
どうもメモリリークの原因は私が思っていたより複雑なようですね。
解決策もいちいちしてたらちょっと手間がかかりそうです。

No.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が直接特定の要素への参照を持ってしまっています。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript コードレビューをお願いします。 1 2022/07/16 05:38
- その他(プログラミング・Web制作) pythonでのカーソル移動がずれる 2 2023/07/30 08:51
- JavaScript 1日1回引けるJavaScriptおみくじについて 1 2022/12/12 22:28
- JavaScript javascriptのちょっとした動作不良(原因は突き止めたのですが) 1 2023/06/15 19:58
- JavaScript 変数のスコープの問題? 3 2022/06/23 09:32
- JavaScript スマフォではボタンを表示させたくない 2 2023/01/20 14:26
- JavaScript gasについて 1 2022/05/31 21:51
- JavaScript jQueryでのドラッグアンドドロップについて 1 2022/07/07 21:04
- JavaScript javascript作成してます。ラジオボタンで判定するコードを書いてます。 1 2023/07/18 11:03
- 統計学 確率論と統計学の{補事象(complementary element)}の読み方は ほじしょう でし 3 2022/10/10 23:48
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Matlabで自作関数をオーバーロード
-
idを使わずにonclickで自身の要...
-
クリックすると上に開くアコー...
-
jQuery|要素だけを変更できま...
-
関数でy=g(x)のgとは何の略です...
-
functionから別のfunctionを実...
-
functionはhtmlやjsに2度使えま...
-
C#テキストボックスの文字を配...
-
ActiveXobjectが作成できない
-
window.openでタイトル名の指定
-
javascriptでiframeのURL変更は?
-
C#OpenCv V4にのエラーに関する...
-
jspからjavascriptの変数引継ぎ
-
【Jquery】changeイベント毎にa...
-
C#で、ContextMenuStripに動的...
-
GASでundefinedエラーが出ます
-
ASP.NET MVCでObjectをjsに渡す
-
テトリス / 配列をブロックに...
-
投稿画像の確認画面
-
同じIDで定義した要素の配列を...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
functionから別のfunctionを実...
-
idを使わずにonclickで自身の要...
-
関数でy=g(x)のgとは何の略です...
-
jQueryの :not() .not() が有効...
-
クリックすると上に開くアコー...
-
JAVAスクリプトで指定時間以降...
-
関数の中の値を取り出したい
-
javascript(jQuery)でセル内...
-
ページ内に複数表がある場合のT...
-
XMLHttpRequestでキャッシュを...
-
jQuery|要素だけを変更できま...
-
jQueryでzipを解凍読み込みする...
-
jslintのエラーについて質問
-
画像がフェードイン・アウトす...
-
変数のスコープの問題?
-
【javascript 】addEventListen...
-
チェックBOX入力後、ある時間に...
-
roundupについて教えてください。
-
[jQuery] クリックで連番関数を...
-
Matlabで自作関数をオーバーロード
おすすめ情報