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

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);
}

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


将它包装在一个自动执行的闭包中:

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

注意:函数表达式对setTimeout的参数没有被使用,所以我把它拿出来了。 此外,使用全局变量也不好。 使用var关键字创建变量。

你也不需要this.i; 只需使用i


像这样:

1
2
3
4
5
6
7
for (var i = 0; i < 5; i++) {
    (function (i) {
        setTimeout(function () {
            console.log(i)
        }, 1000);
    })(i);
}

这里的重要因素是JavaScript只有函数作用域*,因此创建每个循环不同的作用域的唯一方法是将循环的内容包装在函数中。 这样你的setTimeout函数就会为循环的迭代创建一个围绕i的闭包。

编辑:

* let关键字出现在ES6中,使您能够声明块范围局部变量。 如果没有启用实验性功能,Chrome 31不支持它,因此请务必检查兼容性。


试试这个:

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

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