为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

饮歌长啸 2019-03-21 17:15:58
代码如下:for (let i = 0; i < 5; i++) {     setTimeout(function() {             console.log(i);     }, i * 1000); }打印结果:提问:为什么这里动态设置setTimeout的延迟时间,效果确实大概1s打印出一个结果?如果想实现每隔0s,1s,2s,3s,4s打印一个结果,该如何修改代码呢?
查看完整描述

6 回答

?
芜湖不芜

TA贡献1796条经验 获得超7个赞

答案来了


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

}

https://img1.sycdn.imooc.com//5ca3317b0001aa1e03710198.jpg

查看完整回答
反对 回复 2019-04-02
?
慕少森

TA贡献2019条经验 获得超9个赞

在循环中,每一次循环决定在i*1000毫秒后执行一次打印。

那么要修改其次很简单,首先声明一个根据你的目的计算延迟的函数


function getDelay(i) {

  var result = 0

  while (i > 0) {

    result += i;

    i--;

  }

  return result;

}

然后将原有代码


i * 1000

这个地方改为


getDelay(i) * 1000


查看完整回答
反对 回复 2019-04-02
?
守候你守候我

TA贡献1802条经验 获得超10个赞

for (let i = 0, t = 0; i < 5; i++, t+=i*1000) {

    setTimeout(function() {

        console.log(i);

    }, t);

}


查看完整回答
反对 回复 2019-04-02
?
蓝山帝景

TA贡献1843条经验 获得超7个赞

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


setTimeout(function(){

    console.log(i)

},i*(i+1)/2*1000)

}


查看完整回答
反对 回复 2019-04-02
?
MYYA

TA贡献1868条经验 获得超4个赞

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

查看完整回答
反对 回复 2019-04-02
?
慕丝7291255

TA贡献1859条经验 获得超6个赞

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


查看完整回答
反对 回复 2019-04-02
  • 6 回答
  • 0 关注
  • 1607 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号