for (var i = 0; i < 5; i++) {
with (x = new XMLHttpRequest()) open("GET","d.php?id=" + i), send(null), onreadystatechange = function() {
if (x.readyState == 4 && x.status == 200) alert(i);
}
}
现在我希望每次readyState = 4
时,它都应该提醒调用了哪个URL的i
的正确值。目前,它仅提醒一次,输出提醒为5
答案 0 :(得分:4)
如果您想使用with
来保留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);
}
}
}
或者您需要在with
之外创建xhr并向其添加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());
}
答案 1 :(得分:1)
这是因为闭包捕获了i
变量本身,而不仅仅是当前值。我个人会这样做:
for(var i = 0; i < 5; i ++) (function(i) {
[..] alert(i) [..]
})(i);
答案 2 :(得分:1)
只需更新James代码以满足您的需求
for (var i = 0; i < 5; i++) {
with (x = new XMLHttpRequest()) open("GET","d.php?id=" + i), send(null), onreadystatechange = (function(i, x) {
return function () {
if (x.readyState == 4 && x.status == 200) alert(i);
}
})(i, x)
}
希望这有帮助
更新了 x ,这应该可行
答案 3 :(得分:0)
这就是我解决它的方式
var x = new Array();
for (var i = 0; i < 5; i++) {
with (x[i] = new XMLHttpRequest()) open("GET","d.php?id=" + i), send(null), onreadystatechange = (function(i) {
return function () {
if (x[i].readyState == 4 && x[i].status == 404) alert(i);
}
})(i)
}
但我更感兴趣的是使用闭包来解决我的问题,我如何使用闭包来解决我的问题。