2024年5月
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
無料ブログはココログ

 

« ふと思った | トップページ | 今日買ってきた本 »

2006年9月12日 (火)

Ajax.Requestはこう使えばよいのか

Prototype.jsのAjax.Requestに渡すコールバック関数は、オブジェクト内のメソッドを渡しても、thisでオブジェクトの内部変数は参照できない。
まあ、AjaxのFAQに当たるもので、当たり前といえば当たり前である。

これを解決するにはクロージャを使う。

こんな感じ。

<script language="javascript">
function TEST(x){
  var val=x;
  this.dispVal=function(Res){
    alert(val+Res.responseText);
  }
}
var t=new TEST('aaa');
function Read(URL){
  var a=new Ajax.Request(
     URL,
     {method: 'get', asynchronous :true, onComplete: function(Res){t.dispVal(Res); }});

Read('http://test.com/test.txt');
</script>

実行すると、アラートダイアログのメッセージに'aaa'+<http://test.com/test.txtの内容>が出力される。

ミソは、TEST()の変数valに設定することと、TEST()をnewで作ること。
TEST()の変数valは、ローカル変数のように見えるが、メンバ変数と考えればよいのか?そうすると、newしたオブジェクトを保っている間は保持される。(this.valでないことに注意)

これの問題は、クロージャが残ったままになり、溜まりにたまるとメモリリークを起こしてしまうことと、ローカル変数tの処遇に困ること。うまく開放すればよいのだが。

« ふと思った | トップページ | 今日買ってきた本 »

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック


この記事へのトラックバック一覧です: Ajax.Requestはこう使えばよいのか:

« ふと思った | トップページ | 今日買ってきた本 »