使用setTimeout,为什么下面这样写,都是大概每隔1s打印一个结果呢?

代码如下:

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

打印结果:

clipboard.png

提问:为什么这里动态设置setTimeout的延迟时间,效果确实大概1s打印出一个结果?如果想实现每隔0s,1s,2s,3s,4s打印一个结果,该如何修改代码呢?

阅读 3.5k
6 个回答

答案来了

function sum(i){if(i){return sum(i-1) + i}else return 0}
for (let i = 0; i < 5; i++) {
    setTimeout(function() {
        console.log(i);
    }, sum(i) * 1000);
}

图片描述

在循环中,每一次循环决定在i*1000毫秒后执行一次打印。
那么要修改其次很简单,首先声明一个根据你的目的计算延迟的函数

function getDelay(i) {
  var result = 0
  while (i > 0) {
    result += i;
    i--;
  }
  return result;
}

然后将原有代码

i * 1000

这个地方改为

getDelay(i) * 1000
for (let i = 0, t = 0; i < 5; i++, t+=i*1000) {
    setTimeout(function() {
        console.log(i);
    }, t);
}

for(let i = 0; i < 5; i++){

setTimeout(function(){
    console.log(i)
},i*(i+1)/2*1000)

}

这个问题,我是这样理解的,首先,js解释器已经把代码读完了,setTimeout是异步的,所以他们是同时开始计时,也就是一秒一个,而是同步的,先等一秒,再等2秒,3秒。
如果要实现你想要的效果,需要单独做个变量,或者把现在的异步改成同步。

这个应该是js闭包,建议了解一下相关知识,答案也就有了

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题