为什么循环之后才执行setTimeout

myepoch 2017-04-11 08:17:27
为什么循环之后才执行setTimeout,无论i是多少,即便I<10000000000000,也是执行完循环后才执行setTimeout
for (var i = 0; i < 10; i++) {
console.log("hi:"+i);
setTimeout(function() {console.log(i); }, 3000 * (i+10));
}

hi:0
hi:1
hi:2
hi:3
hi:4
hi:5
hi:6
hi:7
hi:8
hi:9
10
10
10
10
10
10
10
10
10
10
...全文
265 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
myepoch 2017-04-12
  • 打赏
  • 举报
回复
引用 8 楼 zzgzzg00 的回复:
第一次打印是在半分钟后 之后每三秒打印一次 自己算下 3*(0+10)=30 3*(1+10)=33 同时开始的
刚才算错了,是对的。谢谢
myepoch 2017-04-12
  • 打赏
  • 举报
回复
引用 7 楼 myepoch 的回复:
[quote=引用 5 楼 qq_24744869 的回复:] [quote=引用 4 楼 myepoch 的回复:] [quote=引用 1 楼 zzgzzg00 的回复:] setTimeout是将任务放到队列里 等这次事件执行完毕才会执行队列里的任务 所以并不会一定在n秒后执行
那为什么 打印出10的时间间隔都一样呢? 明明 3000 * (i+10),应该每次打印的时间间隔一次比一次长才对啊。[/quote] 打印出的都是10那间隔肯定都是3000*(10+10)啊,闭包了[/quote] 不是的,表达式 3000*(i+10)中的i没有起作用。[/quote] 刚才算错了,是对的。
似梦飞花 2017-04-12
  • 打赏
  • 举报
回复
第一次打印是在半分钟后 之后每三秒打印一次 自己算下 3*(0+10)=30 3*(1+10)=33 同时开始的
myepoch 2017-04-12
  • 打赏
  • 举报
回复
引用 5 楼 qq_24744869 的回复:
[quote=引用 4 楼 myepoch 的回复:] [quote=引用 1 楼 zzgzzg00 的回复:] setTimeout是将任务放到队列里 等这次事件执行完毕才会执行队列里的任务 所以并不会一定在n秒后执行
那为什么 打印出10的时间间隔都一样呢? 明明 3000 * (i+10),应该每次打印的时间间隔一次比一次长才对啊。[/quote] 打印出的都是10那间隔肯定都是3000*(10+10)啊,闭包了[/quote] 不是的,表达式 3000*(i+10)中的i没有起作用。
myepoch 2017-04-12
  • 打赏
  • 举报
回复
引用 5 楼 qq_24744869 的回复:
[quote=引用 4 楼 myepoch 的回复:] [quote=引用 1 楼 zzgzzg00 的回复:] setTimeout是将任务放到队列里 等这次事件执行完毕才会执行队列里的任务 所以并不会一定在n秒后执行
那为什么 打印出10的时间间隔都一样呢? 明明 3000 * (i+10),应该每次打印的时间间隔一次比一次长才对啊。[/quote] 打印出的都是10那间隔肯定都是3000*(10+10)啊,闭包了[/quote] 不对的,你可以试验下,等待的时间绝对不是 3000*(10+10)
MMMMaki 2017-04-12
  • 打赏
  • 举报
回复
引用 4 楼 myepoch 的回复:
[quote=引用 1 楼 zzgzzg00 的回复:] setTimeout是将任务放到队列里 等这次事件执行完毕才会执行队列里的任务 所以并不会一定在n秒后执行
那为什么 打印出10的时间间隔都一样呢? 明明 3000 * (i+10),应该每次打印的时间间隔一次比一次长才对啊。[/quote] 打印出的都是10那间隔肯定都是3000*(10+10)啊,闭包了
myepoch 2017-04-12
  • 打赏
  • 举报
回复
引用 1 楼 zzgzzg00 的回复:
setTimeout是将任务放到队列里 等这次事件执行完毕才会执行队列里的任务 所以并不会一定在n秒后执行
那为什么 打印出10的时间间隔都一样呢? 明明 3000 * (i+10),应该每次打印的时间间隔一次比一次长才对啊。
天际的海浪 2017-04-11
  • 打赏
  • 举报
回复
setTimeout()不会暂停当前程序线程的执行。 而是等当前程序线程执行完,才开始计时,计时到了之后重新建立一个新的程序线程来执行setTimeout()内的代码。
当作看不见 2017-04-11
  • 打赏
  • 举报
回复
javascript是单线程的,setTimeout 无论定时多久,都会放在当前执行事件的后面(或者是到了指定时间), setTimeout(function(){ console.log(1); },0) console.log(0); //输出0 1 所以你的定时器,无论定时多久(最快也是循环之后执行),或者循环多久,都会在循环后面执行,
似梦飞花 2017-04-11
  • 打赏
  • 举报
回复
setTimeout是将任务放到队列里 等这次事件执行完毕才会执行队列里的任务 所以并不会一定在n秒后执行

87,910

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧