这段代码如何让它每隔两秒依次输出循环的数字?

3131975015
  • 322

下面这样一下就全部输出出来了

for(let i=0;i<100;i++){
                setInterval(()=>{
                    console.log(i)
                },2000)
}
回复
阅读 822
3 个回答
for(let i = 0; i < 100; i++) {
    (function(i) {
        setTimeout(function () {
            console.log(i);
        },1000*i);
    })(i)
}

这是因为for循环里定义的i变量其实暴露在全局作用域内,于是多个定时器里的匿名函数它们其实共享了同一个作用域里的同一个变量。

所以如果想要0,1,2,3,4的结果,就要在每次循环的时候,把当前的i值单独存下来,怎么存下当前的循环i值??

利用闭包的原理,闭包使一个函数可以继续访问它定义时的作用域。而这个新生成的作用域将每一次循环的当前i值单独保存了下来。

for(let i=0;i<100;i++){
                setTimeout(()=>{
                    console.log(2000*i)
                },2000*i)
}

题主的代码偏离预期的原因在于,创建了 100 个延时相等的定时器。

  • 假设 for 循环可以在一瞬间执行完毕,那么题主的代码会在一瞬间创建 100 个定时器,这些定时器在 2 秒后输出。
  • 于是,这些定时器在 2 秒后的瞬间,进行了了 100 次的输出。

想要满足要求,只需要 1 个定时器。

  • 创建一个定时器即可,循环可以在定时器的执行函数内部进行。
  • 代码如下所示。
let i = 0;
setInterval(() => {
    if (i < 100)
        console.log(i++);
}, 2000);
你知道吗?

宣传栏