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