XMLHttpRequest の使用例 その2 [NT]
XMLHttpRequest の使用例 の続き。
XMLHttpRequest を複数使う、または繰り返し使う場合の例は次の通り。
ポイントは、
- XMLHttpRequest を関数内のローカル変数にした。
- 匿名関数を使って XMLHttpRequest.onreadystatechange イベントハンドラに XMLHttpRequest を引数として渡す。
この 2 点。XMLHttpRequest をローカル変数にすることで 2 回目に XMLHttpRequest を呼び出されたとき上書きされてしまうことを防止する。onreadystatechange には直接は引数を渡すことはできないので、匿名関数にしてそこからメソッドを呼び出す。
このようにすると、XMLHttpRequest を複数、または繰り返し使うことができる。
参考文献
- Getting Started - MDC
- onreadystatechange に引数を渡す - 英語とプログラミング気まぐれ日記
- XMLHttpRequest の onreadystatechange に引数を渡したかった
- XMLHttpRequest の onreadystatechange の this - IT戦記
タグ:JavaScript
はじめまして。m-itoと申します。
私も同じようにXMLHttpRequestを関数内のローカル変数にして、実際うまく動いてるのですが、ふと疑問に思ったのが、loadContents()の内部で定義されたhttp変数は関数を抜けると解放されてしまいますよね?。実際にhandleHttpResponse(http)が呼び出される時にはその引数の実体がガーベジコレクトされた後で存在しなくなってる場合も有るのかなぁと悩んでるのですが、どう思われますか?。御教示いただければ幸いです。
by m-ito (2009-10-19 13:37)
m-ito さんこんにちは。
> loadContents()の内部で定義されたhttp変数は関数を抜けると解放されてしまいますよね?
今回の場合は、loadContents() の内部でクロージャに http を渡しているので http は解放されないと思います。いわゆる、「スコープ」の話です。
http://d.hatena.ne.jp/susie-t/20070719 でも述べられているのですが、クロージャに引数を渡したときは http はレキシカルスコープにあります。
https://developer.mozilla.org/Ja/Core_JavaScript_1.5_Guide:Working_with_Closures も参照して下さい。m-ito さんと似たような質問が回答されています。
そもそも、私がサンプルとして例示したコードは https://developer.mozilla.org/ja/AJAX/Getting_Started を元にしているので、開発元がリファレンスとしているコードなので少なくとも Firefox では問題ないでしょう :-)
こんな回答でよろしいでしょうか...
by p2 (2009-10-19 22:01)