我有这样的Javascript代码,它按预期工作:
<div class="test"></div>
<script>
setTimeout(function(){$(".test").append("test1")},1000);
setTimeout(function(){$(".test").append("test2")},2000);
</script>
<script src="js/jquery.min.js"></script>
它显示“测试1”,然后再“test2的”一秒钟后,因为这样的:“test1test2”,这是我想要的。
当我尝试这样做在for循环,就像这样:
var timeInterval = 1000;
for (var i = 0, l = 2; i < l; i++ ) {
setTimeout(function(){$(".test").append("test" + i)},timeInterval);
timeInterval += 1000;
}
然后我得到“测试2”,然后再“test2的”一秒钟后,因为这样的:“test2test2”,这不是我想要的。
事实上,如果L = 3,然后我得到“test3test3test3”而不是“test1test2test3”。 有谁知道如何解决这个问题呢?
了var i
当递增到2 setTimeout
正在执行的功能,所以它只是打印的i
的值作为2导致test2test2
。
您应该使用封闭使用的情况下i
将打印test1test
。
DEMO: http://jsfiddle.net/mBBJn/1/
var timeInterval = 1000;
for (var i = 0, l = 2; i < l; i++) {
(function(i) {
setTimeout(function() {
$(".test").append("test" + (i+1))
}, timeInterval);
timeInterval += 1000;
})(i);
}
编辑:使用函数参数。
for循环不会创建一个新的范围,你可以使用另一个函数做到这一点:
var timeInterval = 1000;
for (var i = 0, l = 2; i < l; i++) {
setTimeout((function(i) {
return function() {
$(".test").append("test" + i);
}
})(i), timeInterval);
timeInterval += 1000;
}
变量i
总是引用的当前值i
(没有价值i
在这种情况下调用时)。
这是范围在JavaScript中是如何工作的。
见@Esailija答案的解决方案。
保持最明显的方法i
在范围上解决在其他的答案,但因为你是使用jQuery,你还有其他的选择。
使用$.each
而不是for
循环,这样,你要访问i
的变量在该范围内的任何地方。
使用delay
,而不是setTimeout
。 对于这个工作,你需要先触发队列: $(".test").show(0).delay(timeInterval).append("test" + i)
这是因为你没有捕捉的价值i
从for循环。 你可以调整你的代码,这使得它的工作:
var timeInterval = 1000;
for (var i = 0, l = 2; i < l; i++ ) {
(function(i2, timeInterval2) {
setTimeout(function() {
$(".test").append("test" + i2);
}, timeInterval2);
})(i, timeInterval);
timeInterval += 1000;
}