のくす牧場
コンテンツ
牧場内検索
カウンタ
総計:127,645,190人
昨日:no data人
今日:
最近の注目
人気の最安値情報

私的良スレ書庫

不明な単語は2ch用語を / 要望・削除依頼は掲示板へ。不適切な画像報告もこちらへどうぞ。 / 管理情報はtwitter
ログインするとレス評価できます。 登録ユーザには一部の画像が表示されますので、問題のある画像や記述を含むレスに「禁」ボタンを押してください。

元スレ+ JavaScript の質問用スレッド vol.75 +

JavaScript スレッド一覧へ / JavaScript とは? / 携帯版 / dat(gz)で取得 / トップメニュー
スレッド評価: スレッド評価について
みんなの評価 :
タグ : 追加: タグについて ※前スレ・次スレは、スレ番号だけ登録。駄スレにはタグつけず、スレ評価を。荒らしタグにはタグで対抗せず、タグ減点を。
レスフィルター : (試験中)
←前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 次へ→ / 要望・削除依頼は掲示板へ / 管理情報はtwitter
51 : Name_Not - 2009/12/04(金) 21:30:29 ID:??? (+45,+13,-14)
>>49
widtって、なんて発音するの?
52 : Name_Not - 2009/12/04(金) 23:35:26 ID:??? (+52,+29,-5)
揚げ足取りは楽しいかい?
53 : Name_Not - 2009/12/05(土) 01:16:54 ID:??? (+57,+29,-33)
揚げ足というか、指摘の仕方の問題だと思うが...
これくらい許容してやれ
54 : Name_Not - 2009/12/05(土) 01:56:44 ID:??? (+52,+29,-1)
というかつーかその両方
55 : Name_Not - 2009/12/05(土) 02:57:42 ID:??? (+34,+18,+0)
マジキチ
56 : Name_Not - 2009/12/05(土) 03:27:48 ID:??? (+83,+30,-54)
JavaScriptは1ヶ月ほどしかやってないのですが、
他言語はいくつかやってきたので結構すんなり入門できました。
しかし自分の書き方だとメモリリークが激しいようで困っています。
とはいえいまさらクセを矯正するのも難しいのですが、
メモリリークを発生させないコツのようなものはないでしょうか?
すでに作成したスクリプトが膨大になっているのでどこをどうしてよいやら・・・
57 : Name_Not - 2009/12/05(土) 04:04:56 ID:zAJyq7ds (+58,+29,-39)
スコープと参照に起因するものとか。
要素の循環参照なんかはわりと有名な話。
58 : Name_Not - 2009/12/05(土) 04:21:14 ID:??? (+19,-15,-38)
循環参照によるリークはとっくに問題にならないくらいに解消されてないかな?
少し前に手元の IE6 と Detector でいくつかサンプルコード試したけど、ほとんどリークは再現しなかった。
59 : Name_Not - 2009/12/05(土) 04:22:00 ID:??? (+65,+29,-44)
>>57
ありがとうございます。
調べたところ、http://msdn.microsoft.com/ja-jp/library/bb250448%28VS.85%29.aspx
このサイトに辿りつきました。
じっくり読んでリークパターンを分析してみます。
60 : 56 - 2009/12/05(土) 04:27:38 ID:??? (+18,-29,-64)
>>58
レスありがとうございます。

ところでIEではDripを、FirefoxではLeak Monitorを利用してメモリリークが起きてないか調べてます。
FirefoxでおきなければIE以外の他のブラウザでは起きないと割り切ってこの2種類だけでやってるのですが、
Firefoxでは特に検出されません。
メモリリークがおきるのはIEで閲覧した場合が多いという認識でよろしいですか?
61 : Name_Not - 2009/12/05(土) 05:04:34 ID:??? (+11,-29,-59)
>>60
それは何とも言い様がないと思う。
ブラウザのバージョンにもよるし、今やベンダーの対応も進んでる訳で。
自分で確認する限り、IE6 でリークするコードも IE8 では再現されないし。


できたらリークを再現するコードと IE のバージョンを教えて欲しい。
62 : 56 - 2009/12/05(土) 08:17:30 ID:??? (+45,-30,+0)
>>61
ちょっと寝てました。すみません。
どのコードが該当するのかはわかりませんが、
再現できるコードがあったのでお願いします。(他の部分も原因があるかもしれませんが)
<script>
function test() {
var obj = document.getElementById("hoge");
var html = "";
if (!obj.innerHTML) {
html += "<h1>Window</h1>";
for (var i in window) {
html += i + "<br>";
}
html += "<h1>Document</h1>";
for (var i in document) {
html += i + "<br>";
}
html += "<h1>Navigator</h1>";
for(var i in navigator) {
html += i + "<br>";
}
}
obj.innerHTML = html;
}
</script>
<button onclick="test()">Click</button>
<div id="hoge"></div>
Clickを押すごとに表示されたり消えたりしますが、そのたびにメモリの消費があがり続けます。ページを変えても消費したままです。
IEのバージョンは7.0です。8.0にしてますが、Dripだとどうも7.0のエンジンを使うみたいで。
http://outofhanwell.com/ieleak/index.php?title=Main_Page#Download
右下のグラフが何度Clickおしても横ばいになったままで、ページを変えたら下がっていくように作れればいいのですが・・・
63 : Name_Not - 2009/12/05(土) 08:55:40 ID:??? (+0,-28,-7)
windowだかdocumentだかをfor-inするとリークするというのを見たことがある気がするが
よく覚えてないし嘘かもしれない
64 : Name_Not - 2009/12/05(土) 09:12:16 ID:??? (+56,+28,-14)
あれはクラッシュコードだった、忘れて
http://www.crashie.com/
66 : Name_Not - 2009/12/05(土) 15:21:05 ID:??? (-1,-29,-102)
>scriptタグが現れた順に同期通信で読み込まれていく
>後のスクリプトがそれ以前が読み込まれる前に実行されることはない
そう
HTMLで上にあるほうから順にインラインや外部ファイルの区別無く同じスコープで実行される
前後することはないし、HTMLレンダリングも止まる

だからHTML上部で指定した外部サーバのjsのレスポンスが悪いと
そのページ自体の表示も酷く遅くなる
67 : 65 - 2009/12/05(土) 15:30:11 ID:VVbuk+3N (-20,+29,-2)
>>66
ありがとうございます!たいへんすっきりしました。
68 : Name_Not - 2009/12/05(土) 16:30:33 ID:??? (+3,-30,-131)
下のスクリプトでは置換ができませんでした。
何が間違ってるんでしょうか?

「.replace(/(hoge)/g, "$1 + something")」は置換できることと
「.replace(/\<span class\=hoge\>(.*?)\<\/span\>/g, "$1 + something")」でも置換できないことの確認はしました。

<head>
<script type="text/javascript">
function addsomething() {
document.body.innerHTML = document.body.innerHTML.replace(/<span class=hoge>(.*?)<\/span>/g, "$1 + something");
}
</script>
</head>
<body onload=addsomething()>
<span class=hoge>hoge</span>
</body>
69 : Name_Not - 2009/12/05(土) 16:34:53 ID:??? (+2,-29,-31)
alert(document.body.innerHTML);
してみりゃわかるんじゃね?
70 : Name_Not - 2009/12/05(土) 16:51:49 ID:??? (-1,-30,-32)
>>69
<span class="hoge"> のように " が自動で追加されていましたので

.replace(/<span class\"=hoge\">(.*?)<\/span>/g, "$1 + something")

に書き換えたのですが、やはり置換してくれませんでした…。
71 : Name_Not - 2009/12/05(土) 17:20:21 ID:??? (-1,-29,-20)
spanとclassの間の半角スペースを\sに変える
72 : Name_Not - 2009/12/05(土) 17:23:11 ID:??? (-2,-29,-8)
これでいけたよ

/<span class="hoge">(.*?)<\/span>/g
73 : Name_Not - 2009/12/05(土) 17:34:37 ID:??? (-2,-30,-27)
>>72
ありがとうございます。うまくうごきました。
\ を とって気づいたのですが、 " の位置がずれてたのが動かない原因でした。
× <span class\"=hoge\">
○ <span class=\"hoge\">
74 : Name_Not - 2009/12/05(土) 17:42:38 ID:??? (+57,+29,-22)
prototype.jsの読み方教えて
ぷろとたいぷてんじぇいえす?
75 : Name_Not - 2009/12/05(土) 18:11:15 ID:??? (-6,-29,-15)
prototype.jsと読みます
76 : Name_Not - 2009/12/05(土) 18:23:01 ID:??? (-6,-29,-1)
CodeReposが404なんだが
77 : Name_Not - 2009/12/05(土) 19:36:29 ID:??? (+3,-30,-40)
var x = {};
var y = {};
x === y; // false

var x = {};
var y = x;
var z = y;
y === z; // true

両方ともtrueになると思ったのですがなぜ上のだけfalseになるのですか
78 : Name_Not - 2009/12/05(土) 19:52:34 ID:??? (+43,+25,-1)
えっ?
79 : Name_Not - 2009/12/05(土) 19:58:53 ID:??? (+3,-30,-69)
JavaScriptのObjectは参照だからな
上のがtrueになると
x.hoge = fuga;
ってしたときにyのhogeにもfugaが代入されることになる
下のは同じ中身(参照)だからtrueになる
80 : Name_Not - 2009/12/05(土) 20:03:16 ID:??? (+57,+29,+0)
あー参照か確かにそういえばそうだった
81 : Name_Not - 2009/12/05(土) 20:21:10 ID:??? (-3,-26,+0)
xとyは違うものを参照しとるからね
82 : Name_Not - 2009/12/05(土) 21:15:29 ID:??? (-1,-29,-30)
Objectは参照だとは知らんかった、勉強になったw
ということは、x.hoge = "";と解放したつもりになっていても、
どこか他のところで参照を続けていたらメモリに残り続けるの?
83 : Name_Not - 2009/12/05(土) 21:22:24 ID:??? (+75,+29,-46)
そういうこと
まあDOMが絡まない循環参照ぐらいなら、参照されていてもちゃんとGCされるけど
意図せずクロージャでローカル変数が残る場合もある
84 : Name_Not - 2009/12/05(土) 22:01:06 ID:??? (+57,+29,-7)
そっか、クロージャで残る可能性もあるか・・・
気を付けよう・・・
85 : Name_Not - 2009/12/06(日) 05:00:38 ID:y93sLVcL (+35,+29,-47)
>>83
ああああ!
そのせいで金曜の仕事が伸びて、土曜は潰れたようわああん!


ちゃんと設計して、コーディングせにゃいかんね…
86 : Name_Not - 2009/12/06(日) 06:46:20 ID:??? (+3,-29,-49)
> x.hoge = "";と解放したつもり
これは…
delete か、せめて undefined なり null なりにしてくださいよ…

そもそも、ページ遷移すればごっそりコンテキスト変わるんだから、
ほとんどのJavaScriptでは細かい参照とか気にしても意味がない
87 : Name_Not - 2009/12/06(日) 07:00:23 ID:??? (+54,+26,-2)
>>62どなたか分かりませんか?
88 : Name_Not - 2009/12/06(日) 07:10:22 ID:??? (+12,-29,-39)
>>62
WinXPのIE6とIE8で試したけど、再現しないのでさっぱり。

あえて言えば、IEの+=は重いから、配列にpushしたほうが良いよとか
89 : Name_Not - 2009/12/06(日) 07:42:13 ID:??? (+44,-24,-57)
>>88
ありがとうございます。
メモリリークしてるというのは思い違いなんでしょうか?
ずっとClickを押すたびに使用メモリが上がっていきブラウザ閉じるまで解放される様子がないので、
それがメモリリークだと思っていたのですが。
これからは+=をpushに変えてみます。
91 : Name_Not - 2009/12/06(日) 10:07:43 ID:??? (+3,-19,-12)
いやcanvasだし
92 : Name_Not - 2009/12/06(日) 11:31:38 ID:??? (-8,-26,-2)
>>90
下に書いてあるPower by見た?
93 : Name_Not - 2009/12/06(日) 12:07:09 ID:??? (+52,+29,-1)
もう一度ご覧頂こう
94 : Name_Not - 2009/12/06(日) 12:12:32 ID:??? (-11,-29,-54)
>>90
自分で描画してみたいってことだよね?
CANVASとVML(IE)で描画できるよ
95 : Name_Not - 2009/12/06(日) 12:39:37 ID:??? (+63,+29,-24)
>>89
その現象はまさしくメモリリークだけど、
そのコードでそこまで盛大なメモリリークが起きるとは考えにくいな。
環境依存な気がするので、別の環境や別の方法で調べたりしてみてほしい
96 : Name_Not - 2009/12/06(日) 12:44:59 ID:??? (+52,+29,-4)
変なツールバーを飼ってるんだろう
97 : Name_Not - 2009/12/06(日) 23:28:46 ID:??? (-2,-30,-80)
ダブルクォートを alert で呼べずに困っています。

onclick="alert('\"')"

バックスラッシュではエスケープしてくれませんでした。
どう記述すれば " を表示できますか?
98 : Name_Not - 2009/12/06(日) 23:31:38 ID:??? (+31,-29,-29)
それhtmlの解釈の時点で"alert('\"が属性値だと判断されてるだろ
99 : Name_Not - 2009/12/06(日) 23:33:18 ID:??? (+33,-19,+0)
"
"
100 : Name_Not - 2009/12/06(日) 23:36:15 ID:??? (-1,-19,+1)
"
"
←前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 次へ→ / 要望・削除依頼は掲示板へ / 管理情報はtwitterで / JavaScript スレッド一覧へ
スレッド評価: スレッド評価について
みんなの評価 :
タグ : 追加: タグについて ※前スレ・次スレは、スレ番号だけ登録。駄スレにはタグつけず、スレ評価を。荒らしタグにはタグで対抗せず、タグ減点を。

類似してるかもしれないスレッド


トップメニューへ / →のくす牧場書庫について