私的良スレ書庫
不明な単語は2ch用語を / 要望・削除依頼は掲示板へ。不適切な画像報告もこちらへどうぞ。 / 管理情報はtwitterでログインするとレス評価できます。 登録ユーザには一部の画像が表示されますので、問題のある画像や記述を含むレスに「禁」ボタンを押してください。
元スレ+ JavaScript の質問用スレッド vol.120 +
JavaScript スレッド一覧へ / JavaScript とは? / 携帯版 / dat(gz)で取得 / トップメニューみんなの評価 :
レスフィルター : (試験中)
でもDOM⇔JSエンジンの循環参照がリークになるかは、ブラウザがその辺を対策して
リークしないようにしてるかもしれないし、実際にリークしてるかを誰も証明してないな
しかもページ遷移すれば全部破棄されるから気になるようなリークにもならないだろ
リークしないようにしてるかもしれないし、実際にリークしてるかを誰も証明してないな
しかもページ遷移すれば全部破棄されるから気になるようなリークにもならないだろ
間違ってないが?
使われてない変数もクロージャになるのソースは?
使われてない変数もクロージャになるのソースは?
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しかない
このことから使われない変数はクロージャに保存されないと分かる
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しかない
このことから使われない変数はクロージャに保存されないと分かる
巻数かネストされていてもどの変数が使われるのかを把握しているようですが
どういう仕組みで把握していると思いますか?
どういう仕組みで把握していると思いますか?
また循環参照のときみたいに勝手に言葉の意味を定義するアホが現れたな
メモリリークって言葉には、その現象がどういう範囲で生じるかなんて意味は含まれていない
そして、Internet Explorerリークパターンにおけるメモリリークはページ単位で発生する現象なので、
ページ遷移すればリークしたメモリは回収される
http://msdn.microsoft.com/ja-jp/library/bb250448.aspx
メモリリークって言葉には、その現象がどういう範囲で生じるかなんて意味は含まれていない
そして、Internet Explorerリークパターンにおけるメモリリークはページ単位で発生する現象なので、
ページ遷移すればリークしたメモリは回収される
http://msdn.microsoft.com/ja-jp/library/bb250448.aspx
>>157
お前じゃねーか、全然分かってないのw
お前じゃねーか、全然分かってないのw
>>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) で明示的に開放してやってるんだよ。
クロージャの事をまるで理解してないだろ。
---
"通常、関数のローカル変数と、関数を呼び出すときに使用されるパラメータは、関数自体の継続期間中のみ存在します。クロージャを使用すると、これらの変数とパラメータは、クロージャが有効である限り未解決の参照を持ち続けます。"
http://msdn.microsoft.com/ja-jp/library/bb250448.aspx
---
この挙動はクロージャの仕様であってバグではない。
クロージャは何もしなければ、ページを unload するまで参照を持ち続ける。
当然、IE6 SP2 だけでなく、Google Chrome でも Firefox でも同じ挙動になる(unload 時にローカル変数を参照すれば開放されてないことが分かるはずだ)。
IE6 SP2 は unload 時にメモリが開放されないから、window.detachEvent('onunload', handler) で明示的に開放してやってるんだよ。
このスレでアスペと発言する人は「自分の発言が期待通りに解釈する能力がない人」という意味で使ってるよな
自分の日本語がおかしくても伝わらない事に気が付いてないようだが
自分の日本語がおかしくても伝わらない事に気が付いてないようだが
>>163
今までクロージャに纏わる循環参照が問題にされていたんだからクロージャと認識するのが自然だろ
突然、なんに脈絡もなく、クロージャ以外の話をして、それが何の話かも明言してない(目的語を省略)のに周囲に理解されると思ってんの?
今までクロージャに纏わる循環参照が問題にされていたんだからクロージャと認識するのが自然だろ
突然、なんに脈絡もなく、クロージャ以外の話をして、それが何の話かも明言してない(目的語を省略)のに周囲に理解されると思ってんの?
>>163
ページ遷移時に破棄されることが証明出来てないでしょ
ページ遷移時に破棄されることが証明出来てないでしょ
>>167
> 新しい Web アプリケーションは、より高い標準に従います。ページはナビゲートされずに何時間も実行され、
> Web サービスを通じて更新情報を動的に取得する場合があります。複合イベント スキーム、オブジェクト指向の JScript、
> およびアプリケーション全体を生成するためのクロージャを組み合わせることで、言語機能が限界点に達します。
> これらの変更およびその他の変更により、特定のメモリリークパターンが顕著になります。
> 以前はナビゲーションによって隠されていたメモリリークパターンは特に顕著になります。
> 新しい Web アプリケーションは、より高い標準に従います。ページはナビゲートされずに何時間も実行され、
> Web サービスを通じて更新情報を動的に取得する場合があります。複合イベント スキーム、オブジェクト指向の JScript、
> およびアプリケーション全体を生成するためのクロージャを組み合わせることで、言語機能が限界点に達します。
> これらの変更およびその他の変更により、特定のメモリリークパターンが顕著になります。
> 以前はナビゲーションによって隠されていたメモリリークパターンは特に顕著になります。
そもそもie6使ってる奴がいても普通はsp3にしてるだろ
ie6sp2のシェアなんてもはやほとんどないんじゃね
ie6sp2のシェアなんてもはやほとんどないんじゃね
http://msdn.microsoft.com/ja-jp/library/bb250448.aspx のどこにページ遷移したらメモリが解放されると書いてあるんだろう
MS IE以外のケースもの気になる
MS IE以外のケースもの気になる
chrome使ってるとページ遷移してもメモリ解放されてないと感じるな
ページ遷移のタイミングでは解放されない、というだけだが
ページ遷移のタイミングでは解放されない、というだけだが
http://ja.wikipedia.org/wiki/Internet_Explorer_6
2013年以降、Internet Explorer 6をインターネットから新規インストールしようとすると
「ダウンロードの場所情報は壊れています。」とエラーが出てしまい、
新規インストールすらできなくなってしまっている。
もうこんなブラウザのことなんてほっとけよww
2013年以降、Internet Explorer 6をインターネットから新規インストールしようとすると
「ダウンロードの場所情報は壊れています。」とエラーが出てしまい、
新規インストールすらできなくなってしまっている。
もうこんなブラウザのことなんてほっとけよww
このスレは攻撃的な人が多くて嫌な感じだなあ
アスペとか荒れの火種でしかない発言は控えてほしいんだけどな
アスペとか荒れの火種でしかない発言は控えてほしいんだけどな
クロージャ作成時にその中で使う変数を再帰的に同定しているということは、
その処理はかなり重いものにならざるを得ませんね?
その処理はかなり重いものにならざるを得ませんね?
関数は自分が使う変数のインデックスのようなものを内部属性として持ってるのでしょうか?
evalとかが無ければ静的な文法スコープなんだから
関数の定義を外側から内側へ構文解析していくときに
どの関数がどの変数を補足してるかは決まってしまうんじゃないの?
関数の定義を外側から内側へ構文解析していくときに
どの関数がどの変数を補足してるかは決まってしまうんじゃないの?
意味がよくわからない
再代入できるとなんで動的に決めないといけないの?
再代入できるとなんで動的に決めないといけないの?
aという変数に関数が入っていて
ある関数bの中でa()を実行していたとすると
どこがでaを別の関数に差し替えされると、それに従い関数bで使用される変数も変わります
ある関数bの中でa()を実行していたとすると
どこがでaを別の関数に差し替えされると、それに従い関数bで使用される変数も変わります
aに代入された関数はそのaを実行する場所のスコープに存在する変数を補足しません
aに代入された関数が定義された場所のスコープの変数を補足します
これが静的な文法スコープというものです
aに代入された関数が定義された場所のスコープの変数を補足します
これが静的な文法スコープというものです
実行される場所のスコープじゃなくて
定義された場所のスコープで補足する変数が決まる
だから構文解析の時点で補足する変数が決まる
だよね?
定義された場所のスコープで補足する変数が決まる
だから構文解析の時点で補足する変数が決まる
だよね?
alert("string "+a+b)
a,bはint
これって50,10だとすると
string 5010になるんですね
a,bはint
これって50,10だとすると
string 5010になるんですね
と思ったら、確かめたところ、
既に作られた関数が外側から取り込むことはないようです
ナマ言ってすみませんでした
既に作られた関数が外側から取り込むことはないようです
ナマ言ってすみませんでした
関数が定義されたときに、
現在有効なスコープチェーンを保存しておきます。
関数が呼び出されたときに、新たにオブジェクトを生成し、
ローカル変数を保存します。
そして、この新しいオブジェクトを保存しておいたスコープチェーンに追加し、
関数呼び出し時のスコープチェーンを表す新たなスコープチェーンを生成します。
とJavaScript第六版にありました
現在有効なスコープチェーンを保存しておきます。
関数が呼び出されたときに、新たにオブジェクトを生成し、
ローカル変数を保存します。
そして、この新しいオブジェクトを保存しておいたスコープチェーンに追加し、
関数呼び出し時のスコープチェーンを表す新たなスコープチェーンを生成します。
とJavaScript第六版にありました
%指定したiframeの高さをJavaScriptで取得したいのですが、うまくいきません。
iframeでメニューとメインコンテンツを作っていて、メニューは折り畳み式になっています。
デフォルトのサイズstyleのheightしていでhtml96%のbody100%のiframe100%です。
メニューは展開するとそのiframeからはみ出すことがあり、その時は当然そのifameにスクロールバーが表示されます。
ですが、私はこの場合両方のiframeのサイズを拡大してbodyにスクロールバーが表示されるようにしたいと思っています。
document.getElementById("menu").height; //menuはメニューのiframeに付けているidです。
でiframeの高さを取得できると思ったのですが、alertで表示させてみてもなにも出力されませんでした。
どうやったら%指定したiframeの高さを取得できるでしょうか?
iframeでメニューとメインコンテンツを作っていて、メニューは折り畳み式になっています。
デフォルトのサイズstyleのheightしていでhtml96%のbody100%のiframe100%です。
メニューは展開するとそのiframeからはみ出すことがあり、その時は当然そのifameにスクロールバーが表示されます。
ですが、私はこの場合両方のiframeのサイズを拡大してbodyにスクロールバーが表示されるようにしたいと思っています。
document.getElementById("menu").height; //menuはメニューのiframeに付けているidです。
でiframeの高さを取得できると思ったのですが、alertで表示させてみてもなにも出力されませんでした。
どうやったら%指定したiframeの高さを取得できるでしょうか?
よく分からないがDOMとハンドラの間に層を作るのはなんか気持ち悪い
気持ち悪いかどうかではなくてですね
そもそも論で悪いけど、DOM-script循環参照ってそんなに気を使う必要あるかな?
1秒間に数十個レベルで要素を生成してるならともかく、通常範囲なら気にする必要はない気がする
IE6なんてもう捨てていいだろうし…
1秒間に数十個レベルで要素を生成してるならともかく、通常範囲なら気にする必要はない気がする
IE6なんてもう捨てていいだろうし…
あ、すみません。
良かったの理由を書いていなかったですね。
まず、ここまでの話をまとめると、DOMとスクリプトの循環参照、
これをやることは本来問題はないわけです。
クロージャーをバンバン使っていいわけです。
問題は循環参照そのものではなく、古いIEで問題があったというだけ。
でも>>134のようにコードの書き方を工夫すれば、
クロージャーを使っても古いIEで問題が起こらない。
で、実はこれって、jQueryを使った場合のコードなんです。
jQueryを使った場合、
function init() {
$('id').on('click', function() {})
}
のようなコードを書くんですが、みてください。DOMとスクリプトの循環参照になっていません。
jQueryは>>134で書いたように内部で独自にイベントハンドラのキューを持っているんです。
内部で独自にキューを持っているのは、そのほうが軽かったり、イベントハンドラを削除する時に
関数を渡さないでも名前空間でばっさり消せるようにするため、だろうと思っていたのですが、
もちろんそれもあるのでしょうが、メモリリーク対策もあったのですね。
jQueryを使うだけで知らないうちにメモリリーク対策された、問題ないクロージャーの
書き方をしていたってわけです。
いままで書いたコードに問題がないとわかったので良かったというわけです。
良かったの理由を書いていなかったですね。
まず、ここまでの話をまとめると、DOMとスクリプトの循環参照、
これをやることは本来問題はないわけです。
クロージャーをバンバン使っていいわけです。
問題は循環参照そのものではなく、古いIEで問題があったというだけ。
でも>>134のようにコードの書き方を工夫すれば、
クロージャーを使っても古いIEで問題が起こらない。
で、実はこれって、jQueryを使った場合のコードなんです。
jQueryを使った場合、
function init() {
$('id').on('click', function() {})
}
のようなコードを書くんですが、みてください。DOMとスクリプトの循環参照になっていません。
jQueryは>>134で書いたように内部で独自にイベントハンドラのキューを持っているんです。
内部で独自にキューを持っているのは、そのほうが軽かったり、イベントハンドラを削除する時に
関数を渡さないでも名前空間でばっさり消せるようにするため、だろうと思っていたのですが、
もちろんそれもあるのでしょうが、メモリリーク対策もあったのですね。
jQueryを使うだけで知らないうちにメモリリーク対策された、問題ないクロージャーの
書き方をしていたってわけです。
いままで書いたコードに問題がないとわかったので良かったというわけです。
前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 次へ / 要望・削除依頼は掲示板へ / 管理情報はtwitterで / JavaScript スレッド一覧へ
みんなの評価 : 類似してるかもしれないスレッド
- + JavaScript の質問用スレッド vol.124 + (1001) - [97%] - 2015/7/16 1:30
- + JavaScript の質問用スレッド vol.123 + (1002) - [97%] - 2015/4/27 23:30
- + JavaScript の質問用スレッド vol.125 + (1001) - [97%] - 2015/10/7 17:45
- + JavaScript の質問用スレッド vol.126 + (348) - [97%] - 2023/1/12 17:00
- + JavaScript の質問用スレッド vol.126 + (952) - [97%] - 2015/11/18 13:15
- + JavaScript の質問用スレッド vol.127 + (160) - [97%] - 2021/7/16 9:30
- + JavaScript の質問用スレッド vol.127 + (1001) - [97%] - 2016/2/4 0:15
- + JavaScript の質問用スレッド vol.123 + (966) - [97%] - 2020/10/20 2:30
- + JavaScript の質問用スレッド vol.128 + (1001) - [97%] - 2016/2/26 6:45
- + JavaScript の質問用スレッド vol.129 + (926) - [97%] - 2017/7/27 13:45
- + JavaScript の質問用スレッド vol.129 + (981) - [97%] - 2016/5/5 8:16
- + JavaScript の質問用スレッド vol.130 + (974) - [97%] - 2016/10/26 14:18
- + JavaScript の質問用スレッド vol.122 + (116) - [97%] - 2018/5/2 18:30
- + JavaScript の質問用スレッド vol.122 + (1004) - [97%] - 2015/2/14 4:45
- + JavaScript の質問用スレッド vol.121 + (1001) - [97%] - 2015/1/1 18:30
- + JavaScript の質問用スレッド vol.121 + (1001) - [97%] - 2022/11/29 16:30
- + JavaScript の質問用スレッド vol.130 + (1001) - [97%] - 2017/11/25 20:45
トップメニューへ / →のくす牧場書庫について