JS setTimeout为0秒后发生了什么

clipboard.png

问题:
1:为啥会输出三个4
2:在chrome的console里面回车之后输出的 83,86,89是啥  会一直累加(ps:之前一开始好像数字很小,慢慢累加)
阅读 9.1k
8 个回答
  1. setTimeout即使给的时间是0,回调也不会立马在for循环的过程中调用,都是推到任务队列去的,所以当回调正式执行的时候,i已经是4了,所以输出三个4

  2. https://developer.mozilla.org...

clipboard.png

也许大概你的i是全局的,setTimeout(function(){..}),这里的function不是立即执行的。你这里的调用时间可能是在循环后再调用,循环完成后i为4

这个建议楼主理解异步回调的机制,js是单线程,你得setTimeout函数虽然时间设置为0,但是也是一个异步,他会在任务池中排队等待js引擎空闲才执行

setTimeout是异步执行的,所以setTimeout无论时间设置多少,都会放到任务队列中等待执行,而for循环是同步执行的,在setTimeout之前,for循环已经完成,i变成了4

js的执行是单线程的,都需要排队去执行的,循环在一瞬间就完成了,即使时间是0,也是在排队。除非你用闭包去解决这个问题,就可以一次输出你想要的了

主程做了基本是到micro task再到marco task
setTimeout就是macro task
for循环将setTimeout将回调函数推进macro task
for循环结束了。执行macro task
此时i的值是引用所以此时的i值应该为4
console.log()输出4遍
第二个问题
setTimeout执行之后会有一个计数器id
控制台默认返回值是上一条语句返回值。
上一条语句是你最后一个setTimeout
值是它的计数器id
那么此时就像你在控制台直接输出一个数字似的

跟js的执行机制有关,js是单线程的,同一时间只能做一件事,通过事件轮询实现异步的执行,直接调用函数变量之类同步执行会进入到执行栈中,按顺序执行,所有的异步执行,则会放入执行队列,在回调接到相应后,插入到执行栈中执行。
setTimeout是个异步执行的回调,在执行队列中,所以会等所有的for循环任务栈结束后再执行,设置的时间代表当回调执行时,等待多长时间后执行,而不是js解析器读到这段代码,等待多长时间执行,所以有时候还会感觉执行时间比给定的时间长。

返回值就像上面所说的是定时器编号,所以一般使用定时器,都会给予一个命名,方便以后清除定时器。

看大家讲的这么精确我都不好意思回答了,哈哈哈

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