由于关闭,setTimeout不会打印连续的数字

时间:2012-11-01 14:33:56

标签: javascript

  

可能重复:
  setTimeout in a for-loop and pass i as value

for (var i = 0; i < 5; i++) {
    setTimeout(function (i) {
        console.log(this.i)
    }, 1000);
}

这会打印5五次。如何编写循环以便打印0, 1, 2, 3, 4

3 个答案:

答案 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);

这将每秒输出一个数字五次。