setTimeout does not print consecutive numbers because of closure
本问题已经有最佳答案,请猛点这里访问。
Possible Duplicate:
setTimeout in a for-loop and pass i as value
| 1 2 3 4 5 | for (var i = 0; i < 5; i++) { setTimeout(function (i) { console.log(this.i) }, 1000); } | 
这打印
将它包装在一个自动执行的闭包中:
| 1 2 3 4 5 | for (var i = 0; i < 5; i++) (function(i) { setTimeout(function() { console.log(i) }, 1000); })(i); | 
注意:函数表达式对setTimeout的参数没有被使用,所以我把它拿出来了。 此外,使用全局变量也不好。 使用
你也不需要
像这样:
| 1 2 3 4 5 6 7 | for (var i = 0; i < 5; i++) { (function (i) { setTimeout(function () { console.log(i) }, 1000); })(i); } | 
这里的重要因素是JavaScript只有函数作用域*,因此创建每个循环不同的作用域的唯一方法是将循环的内容包装在函数中。 这样你的
编辑:
* 
试试这个:
| 1 2 3 4 5 6 7 8 | var i=0; var fn; fn=function(){ console.log(i) i++; if(i<=4)setTimeout(fn,1000); } setTimeout(fn,1000); | 
那将每秒输出一个数字五次。