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

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

JavaScript覧 / PC版 /
スレッド評価: スレッド評価について
みんなの評価 :
タグ : 追加: タグについて ※前スレ・次スレは、スレ番号だけ登録。駄スレにはタグつけず、スレ評価を。荒らしタグにはタグで対抗せず、タグ減点を。
←前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 次へ→ / 要望・削除依頼は掲示板へ / 管理情報はtwitter

151 :

>>150
は?
今のモダンブラウザではそんなダセー実装してないだろ
馬鹿じゃねえの

152 = :

でもDOM⇔JSエンジンの循環参照がリークになるかは、ブラウザがその辺を対策して
リークしないようにしてるかもしれないし、実際にリークしてるかを誰も証明してないな

しかもページ遷移すれば全部破棄されるから気になるようなリークにもならないだろ

153 = :

>>151
アンカー間違ってない?
>>149
> じゃあ関数を返り値にする場合はローカル変数にも気を遣わないといけないのかね
はクロージャの仕様そのものだろ

154 = 151 :

間違ってないが?
使われてない変数もクロージャになるのソースは?

155 = :

function hoge(){
var a = 100,b = 200;
return function(){
return function(){
return function(){
return eval('a');
}
}
}
}

function moge(){
var a = 100,b = 200;
return function(){
return function(){
return function(){
return a;
}
}
}
}

console.log(hoge()()()());
console.log(moge()()()());

chromeのデバッガでトレースすると、evalを使う場合、function scopeにbも含まれている
使わない場合、function scopeにaしかない
このことから使われない変数はクロージャに保存されないと分かる

156 = :

巻数かネストされていてもどの変数が使われるのかを把握しているようですが
どういう仕組みで把握していると思いますか?

157 = :

>>152
> しかもページ遷移すれば全部破棄されるから気になるようなリークにもならないだろ
ページ遷移しても開放されないのがメモリリークなんだが、全然わかってないな

158 = :

また循環参照のときみたいに勝手に言葉の意味を定義するアホが現れたな
メモリリークって言葉には、その現象がどういう範囲で生じるかなんて意味は含まれていない

そして、Internet Explorerリークパターンにおけるメモリリークはページ単位で発生する現象なので、
ページ遷移すればリークしたメモリは回収される
http://msdn.microsoft.com/ja-jp/library/bb250448.aspx

159 = :

>>157
お前じゃねーか、全然分かってないのw

160 = :

>>158-159
クロージャの事をまるで理解してないだろ。

---
"通常、関数のローカル変数と、関数を呼び出すときに使用されるパラメータは、関数自体の継続期間中のみ存在します。クロージャを使用すると、これらの変数とパラメータは、クロージャが有効である限り未解決の参照を持ち続けます。"
http://msdn.microsoft.com/ja-jp/library/bb250448.aspx
---

この挙動はクロージャの仕様であってバグではない。
クロージャは何もしなければ、ページを unload するまで参照を持ち続ける。
当然、IE6 SP2 だけでなく、Google Chrome でも Firefox でも同じ挙動になる(unload 時にローカル変数を参照すれば開放されてないことが分かるはずだ)。
IE6 SP2 は unload 時にメモリが開放されないから、window.detachEvent('onunload', handler) で明示的に開放してやってるんだよ。

161 = :

>>160
おまえほんとにアスペだよなw
クロージャーのことなんて話してませんよw
DOMとJSエンジンの循環参照の話ですw

162 = :

>>161
それだと>>>152の上と下の文が繋がらないだろ

> でもDOM⇔JSエンジンの循環参照がリークになるかは、ブラウザがその辺を対策して
> リークしないようにしてるかもしれないし、実際にリークしてるかを誰も証明してないな
>
> しかもページ遷移すれば全部破棄されるから気になるようなリークにもならないだろ
「どちらにしても循環参照を破棄する」ならメモリリークの有無を誰も証明してない文面がおかしい
もし、証明できるなら>>152がそれを証明しろよ

163 = :

>>162
その三行のどこにクロージャーなんて書いてあるんだ
DOMとJSエンジンの循環参照はクロージャだけが原因だと勘違いしちゃってる?

メモリリークは証明するも何もMSの公式発表だ

164 = :

このスレでアスペと発言する人は「自分の発言が期待通りに解釈する能力がない人」という意味で使ってるよな
自分の日本語がおかしくても伝わらない事に気が付いてないようだが

165 = :

>>163
今までクロージャに纏わる循環参照が問題にされていたんだからクロージャと認識するのが自然だろ
突然、なんに脈絡もなく、クロージャ以外の話をして、それが何の話かも明言してない(目的語を省略)のに周囲に理解されると思ってんの?

166 = :

>>165
DOMとJSエンジンの循環参照によるメモリリークはクロージャかどうかなんて関係無いんだよ
お前が勝手に同じ問題だと勘違いして議論に紛れ込んでただけだろ

167 = :

>>163
ページ遷移時に破棄されることが証明出来てないでしょ

168 = :

>>167
> 新しい Web アプリケーションは、より高い標準に従います。ページはナビゲートされずに何時間も実行され、
> Web サービスを通じて更新情報を動的に取得する場合があります。複合イベント スキーム、オブジェクト指向の JScript、
> およびアプリケーション全体を生成するためのクロージャを組み合わせることで、言語機能が限界点に達します。
> これらの変更およびその他の変更により、特定のメモリリークパターンが顕著になります。
> 以前はナビゲーションによって隠されていたメモリリークパターンは特に顕著になります。

169 = :

実際アスペが多いから仕方ない

171 = :

http://msdn.microsoft.com/ja-jp/library/bb250448.aspx のどこにページ遷移したらメモリが解放されると書いてあるんだろう
MS IE以外のケースもの気になる

172 = :

chrome使ってるとページ遷移してもメモリ解放されてないと感じるな
ページ遷移のタイミングでは解放されない、というだけだが

173 = :

>>171
「サイト内の異なるロケーション間のナビゲーションは解放されたメモリをクリーンアップする~」
って書いてあんぞ?

174 = :

http://ja.wikipedia.org/wiki/Internet_Explorer_6
2013年以降、Internet Explorer 6をインターネットから新規インストールしようとすると
「ダウンロードの場所情報は壊れています。」とエラーが出てしまい、
新規インストールすらできなくなってしまっている。

もうこんなブラウザのことなんてほっとけよww

175 = :

このスレは攻撃的な人が多くて嫌な感じだなあ
アスペとか荒れの火種でしかない発言は控えてほしいんだけどな

176 = :

アスペは不愉快だから仕方ない

177 = :

アスペの方から攻撃してくるからな
つい反撃しちゃうんだよ

178 = :

クロージャ作成時にその中で使う変数を再帰的に同定しているということは、
その処理はかなり重いものにならざるを得ませんね?

179 = :

関数は自分が使う変数のインデックスのようなものを内部属性として持ってるのでしょうか?

180 = :

evalとかが無ければ静的な文法スコープなんだから
関数の定義を外側から内側へ構文解析していくときに
どの関数がどの変数を補足してるかは決まってしまうんじゃないの?

181 = :

変数には再代入出来るので、やはり動的に決めているのでは?

182 = :

意味がよくわからない
再代入できるとなんで動的に決めないといけないの?

184 = :

aに代入された関数はそのaを実行する場所のスコープに存在する変数を補足しません
aに代入された関数が定義された場所のスコープの変数を補足します
これが静的な文法スコープというものです

185 = :

実行される場所のスコープじゃなくて
定義された場所のスコープで補足する変数が決まる
だから構文解析の時点で補足する変数が決まる
だよね?

186 = :

>>179
スコープチェーンでぐぐるべし

>>184
構成によるのでは?
もう一度コード書いて再質問推奨
どれが誰かわからん

188 = :

>>184
クロージャ内でaを呼んでいたらaはクロージャが作成された空間の変数を取り込むはずだが?
はい論破

189 = :

と思ったら、確かめたところ、
既に作られた関数が外側から取り込むことはないようです
ナマ言ってすみませんでした

190 = :

関数が定義されたときに、
現在有効なスコープチェーンを保存しておきます。
関数が呼び出されたときに、新たにオブジェクトを生成し、
ローカル変数を保存します。
そして、この新しいオブジェクトを保存しておいたスコープチェーンに追加し、
関数呼び出し時のスコープチェーンを表す新たなスコープチェーンを生成します。

とJavaScript第六版にありました

191 = :

そこにwithがあったりすると…

193 = :

>>134だけどレスついてないよね?

これで、IEの場合におきるメモリリーク問題は起きなくなるってことであってるよね?

194 = :

よく分からないがDOMとハンドラの間に層を作るのはなんか気持ち悪い

195 = :

気持ち悪いかどうかではなくてですね

196 :

domとjsの間では循環してないから大丈夫そうだね

197 = :

>>196
やっぱりそうなんですね! よかった安心しました。

198 = :

そもそも論で悪いけど、DOM-script循環参照ってそんなに気を使う必要あるかな?
1秒間に数十個レベルで要素を生成してるならともかく、通常範囲なら気にする必要はない気がする
IE6なんてもう捨てていいだろうし…

199 = :

あ、すみません。
良かったの理由を書いていなかったですね。


まず、ここまでの話をまとめると、DOMとスクリプトの循環参照、
これをやることは本来問題はないわけです。
クロージャーをバンバン使っていいわけです。

問題は循環参照そのものではなく、古いIEで問題があったというだけ。
でも>>134のようにコードの書き方を工夫すれば、
クロージャーを使っても古いIEで問題が起こらない。

で、実はこれって、jQueryを使った場合のコードなんです。
jQueryを使った場合、

function init() {
 $('id').on('click', function() {})
}

のようなコードを書くんですが、みてください。DOMとスクリプトの循環参照になっていません。
jQueryは>>134で書いたように内部で独自にイベントハンドラのキューを持っているんです。

内部で独自にキューを持っているのは、そのほうが軽かったり、イベントハンドラを削除する時に
関数を渡さないでも名前空間でばっさり消せるようにするため、だろうと思っていたのですが、
もちろんそれもあるのでしょうが、メモリリーク対策もあったのですね。

jQueryを使うだけで知らないうちにメモリリーク対策された、問題ないクロージャーの
書き方をしていたってわけです。

いままで書いたコードに問題がないとわかったので良かったというわけです。

200 = :

>>199
ページ遷移しないWebアプリでDOM⇔JSエンジン間で循環参照したあとにDOM要素を
削除しても、ちゃんとGCされるのか?
結局、それを誰も証明してないわけで


←前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 次へ→ / 要望・削除依頼は掲示板へ / 管理情報はtwitterで / JavaScript一覧へ
スレッド評価: スレッド評価について
みんなの評価 :
タグ : 追加: タグについて ※前スレ・次スレは、スレ番号だけ登録。駄スレにはタグつけず、スレ評価を。荒らしタグにはタグで対抗せず、タグ減点を。

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


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