onreadystatechange に引数を渡す

ポイントは2つ、
1.引数を渡す方法として、クロージャを使う
2.コールバック関数(以下では handleResult)の中では this を使わない(というか、使えないみたい)
id:amachangのエントリ
XMLHttpRequest の onreadystatechange の this - IT戦記
に救われた。

var hikisuu = "渡したい引数だよ";

var request = window.XMLHttpRequest ? new XMLHttpRequest() : (function() {
    try      { return new ActiveXObject("Msxml2.XMLHTTP");    }
    catch(e) { return new ActiveXObject("Microsoft.XMLHTTP"); }
})();
request.onreadystatechange = function(){ var hoge = arguments[0]; return function() { handleResult(hoge) }; }(hikisuu);
request.open("GET", ".");
request.send(null);

// コールバック関数
function handleResult(i) {
  if (request.readyState == 4 && request.status == 200) {
    alert(i);
  }
}


以下は自分用のメモ。
ウィジェット上の JavaScript はクロスドメインの問題を考慮しなくていいので、JSONP などの手法は使う必要が無い。

自分用のメモ(Y!Widgetの中では、こんな風に使った)
var url = ["http://www.yahoo.co.jp", "htttp://www.google.co.jp"];
var clip_request_array = [];
for (var i = 0, l = url.length ; i < l; i++) {
  getJSON(url[i], i);
}

function getJSON(url, i)
{
  clip_request_array[i] = new XMLHttpRequest();
  clip_request_array[i].onreadystatechange = function(){ var hoge = arguments[0]; return function() {clip_handleResult(hoge)};}(i);
  clip_request_array[i].open("GET", [
    'http://api.clip.livedoor.com/json/comments',
    '?link=', encodeURIComponent(url),
    ].join(''), true);
  clip_request_array[i].send();
}

function clip_handleResult(i) {
  if (clip_request_array[i].readyState == 4 && clip_request_array[i].status == 200) {
  var json_obj = eval("(" + clip_request_array[i].responseText + ")");
  // json_obj を利用した処理が続く…
  }
}