可能重复:
Javascript closure inside loops - simple practical example
让我们假设您在for循环中创建一些ajax请求,如下所示:
$(function(){
for(var i=0;i<10;i++){
$.ajax({
url : '/',
success : function(){
console.log('callback '+i+' fired!');
}
});
}
});
当然,回调每次都会记录'callback 10 fired',因为回调是异步执行的。 问题是:你怎么知道哪个回调被解雇了?
答案 0 :(得分:5)
匿名自调用函数将解决此闭包问题:
$(function(){
for(var i=0;i<10;i++){
(function(i) {
$.ajax({
url : '/',
success : function(){
console.log('callback '+i+' fired!');
}
});
})(i);
}
});
答案 1 :(得分:5)
使用立即调用的函数表达式创建范围:
$(function(){
for(var i=0;i<10;i++){
(function(i){
$.ajax({
url : '/',
success : function(){
console.log('callback '+i+' fired!');
}
});
})(i);
}
});
答案 2 :(得分:2)
通过传递i
的当前值作为闭包的一部分:
$(function(){
for(var i=0;i<10;i++){
$.ajax({
url : '/',
success : (function(i){
return function(){console.log('callback '+i+' fired!');}
})(i)
});
}
});
以下是演示:http://jsfiddle.net/rRwgW/4/
注意:您实际上不需要在IIFE中包装整个ajax调用,只需要引用需要引用i
的值的回调。