如果要使用with
to retain i
,则需要将其添加到也引用该xhr
对象的对象中:
for(var i=0;i<5;i++){
with({i:i, xhr:new XMLHttpRequest()}) {
xhr.open("GET","d.php?id=" + i);
xhr.send(null);
xhr.onreadystatechange=function(){
if (xhr.readyState == 4 && xhr.status == 200)
alert(i);
}
}
}
或者您需要在外部创建 xhrwith
并添加i
到其中。
var xhr;
for(var i=0;i<5;i++){
(xhr = new XMLHttpRequest()).i = i;
with(xhr) {
open("GET","d.php?id=" + i);
send(null);
onreadystatechange=function(){
if (readyState == 4 && status == 200)
alert(i);
}
}
}
但是,如果您想要一个合适的、面向未来的解决方案,请将处理程序置于一个变量范围内,以提供处理程序所需的变量。
function doRequest(i, xhr) {
xhr.open("GET","d.php?id=" + i);
xhr.send(null);
xhr.onreadystatechange=function(){
if (xhr.readyState == 4 && xhr.status == 200)
alert(i);
}
}
并这样称呼它:
for(var i=0;i<5;i++){
doRequest(i, new XMLHttpRequest());
}
或者,如果您坚持像某些人那样内联函数,您可以这样做:
for(var i=0;i<5;i++){
(function (i, xhr) {
xhr.open("GET","d.php?id=" + i);
xhr.send(null);
xhr.onreadystatechange=function(){
if (xhr.readyState == 4 && xhr.status == 200)
alert(i);
}
}(i, new XMLHttpRequest());
}