個人的に
Ajax を使ったプログラミングをしたことがほとんどない。数回あったけどライブラリ経由で XMLHttpRequest は触らなかった。
仕事でも
Prototype.js とか MochiKit とかなので XMLHttpRequest を直接使ったことがない。
用事で使ってみなければならなくなった。
最初に見様見まねで書いたコード
//Executable
var req = window.XMLHttpRequest ? new XMLHttpRequest() : (function() {
try { return new ActiveXObject("Msxml2.XMLHTTP"); }
catch(e) { return new ActiveXObject("Microsoft.XMLHTTP"); }
})();
req.onreadystatechange = function() {
switch (this.readyState) {
case 1: // Open
case 2: // Sent
case 3: // Receiving
break;
case 4: // Loaded
alert(this.responseText);
}
};
req.open('GET', '.');
req.send(null);でも、これは動かなかった
this を req にしたらうまくいった。
//Executable
var req = window.XMLHttpRequest ? new XMLHttpRequest() : (function() {
try { return new ActiveXObject("Msxml2.XMLHTTP"); }
catch(e) { return new ActiveXObject("Microsoft.XMLHTTP"); }
})();
req.onreadystatechange = function() {
switch (req.readyState) {
case 1: // Open
case 2: // Sent
case 3: // Receiving
break;
case 4: // Loaded
alert(req.responseText);
}
};
req.open('GET', '.');
req.send(null);
なぜ this が不定なのか
this は、ブラウザによって値が異なり、 arguments.callee の値だったり Global オブジェクトの値だったり、 req だったりした。
this が Global オブジェクトになるってことは内部的にこうよばれたのと等しい
req['onreadystatechange']();
this が req になるってことは内部的にこうよばれたのと等しい
req.onreadystatechange();
this が arguments.callee になるってことは内部的にこうやって呼ばれたのと等しい(!?)
req.onreadystatechange.apply(req.onreadystatechange);
でも、なぜ??
W3C 的にはどうなんだろう。
http://www.w3.org/TR/XMLHttpRequest/
読んでみたけど特に明記されてないように思う。
this が使えたら
(window.Hoge=function(){}).prototype=new XMLHttpRequest();
Hoge.prototype.onreadystatechange = function() {...}
var hoge = new Hoge();とかして、オブジェクトに組み込めるのに。こっちのがかっこいいよね。
とにかく
onreadystatechange の this は使えない