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

Vam*_*lly 1 javascript

可能重复:
for循环中的setTimeout并将i作为值传递

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

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

0x4*_*2D2 6

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

for (var i = 0; i < 5; i++) (function(i) {
    setTimeout(function() {
        console.log(i)
     }, 1000);
})(i);
Run Code Online (Sandbox Code Playgroud)

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

你也不需要this.i; 简单地用i.


Mik*_*nty 5

像这样:

for (var i = 0; i < 5; i++) {
    (function (i) {
        setTimeout(function () {
            console.log(i)
        }, 1000);
    })(i);
}
Run Code Online (Sandbox Code Playgroud)

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

编辑:

* ES6中引入了let关键字,它使您能够声明块作用域局部变量。Chrome 31在不启用实验功能的情况下不支持它,因此请务必检查兼容性