可能重复:
在 for 循环中设置超时并将 i 作为值传递
for (var i = 0; i < 5; i++) {
setTimeout(function (i) {
console.log(this.i)
}, 1000);
}
这会打印5
五次。如何编写循环以便打印0, 1, 2, 3, 4
?
可能重复:
在 for 循环中设置超时并将 i 作为值传递
for (var i = 0; i < 5; i++) {
setTimeout(function (i) {
console.log(this.i)
}, 1000);
}
这会打印5
五次。如何编写循环以便打印0, 1, 2, 3, 4
?
将其包装在一个自动执行的闭包中:
for (var i = 0; i < 5; i++) (function(i) {
setTimeout(function() {
console.log(i)
}, 1000);
})(i);
注意: setTimeout 的函数表达式的参数没有被使用,所以我把它拿出来了。此外,使用全局变量也不好。var
使用关键字创建变量。
你也不需要this.i
;只需使用i
.
像这样:
for (var i = 0; i < 5; i++) {
(function (i) {
setTimeout(function () {
console.log(i)
}, 1000);
})(i);
}
这里的重要因素是JavaScript 只有函数作用域*,因此为每个循环创建不同作用域的唯一方法是将循环的内脏包装在一个函数中。这样你的函数就会为循环的迭代setTimeout
创建一个闭包。i
编辑:
*let
关键字出现在ES6中,它使您能够声明块作用域的局部变量。如果不启用实验性功能,Chrome 31 不支持它,因此请务必检查兼容性。
试试这个:
var i=0;
var fn;
fn=function(){
console.log(i)
i++;
if(i<=4)setTimeout(fn,1000);
}
setTimeout(fn,1000);
这将每秒钟输出一个数字五次。