好吧,这是你的代码:http://jsfiddle.net/848AE/1/
看在控制台(我改变成功事件失败,但它并不重要)。
function test(param) {
console.log('------------------------------');
console.log('param = ' + param);
var tt = [ "a", "b", "c" ];
for (var i = 0; i < param; i++) {
console.log('Before if-check, i = ' + i);
if (tt[i] == "b") {
console.log('Request start, after if-check i = ' + i);
Ext.Ajax.request({
url : 'test.do',
method : 'POST',
failure: function(response) {
console.log('Failure start, i = ' + i);
test(1);
console.log('Alert(i) = ' + i);
}
});
// break;
}
}
}
test(3);
日志从第一码(在没有休息周期字):
------------------------------
param = 3
Before if-check, i = 0
Before if-check, i = 1
Request start, after if-check i = 1
Before if-check, i = 2
POST http://fiddle.jshell.net/_display/test.do 404 (NOT FOUND) ext-all.js:21
Failure start, i = 3
------------------------------
param = 1
Before if-check, i = 0
Alert(i) = 3
正如你所看到的,当你开始请求,功能并没有停止执行,并继续工作的周期(我= 2,3)。所以,当你从服务器获得响应时,变量i的值为3.
然后,您调用具有参数1的函数,它完成并返回失败函数,但在失败函数范围内,变量i的值仍然为3
因此,如果我理解你的话,你必须在代码注释中添加循环中的break字。
编辑:
如果你喜欢与暂停,直至回调执行,以执行在循环请求,有没有记录属性:
var response = Ext.Ajax.request({
...
async: false,
...
})
结果与异步:假:
param = 3
Before if-check, i = 0
Before if-check, i = 1
Request start, after if-check i = 1
POST http://fiddle.jshell.net/_display/test.do 404 (NOT FOUND) ext-all.js:21
Failure start, i = 1
------------------------------
param = 1
Before if-check, i = 0
Alert(i) = 1
Before if-check, i = 2
可能会重复http://stackoverflow.com/questions/750486/javascript-closure-inside-loops-simple-practical-example – rab
感谢您的回复rab。但对于我来说,第一个功能工作正确(这确定范围是正确的)。只有当我在事件中使用“我”时才有问题。 –