js是单线程,你得setTimeout函数虽然时间设置为0,可是也是一个异步,他会在任务池中排队等待js引擎空闲才执行.segmentfault
js的执行是单线程的,都须要排队去执行的,循环在一瞬间就完成了,即便时间是0,也是在排队。除非你用闭包去解决这个问题,就能够一次输出你想要的了闭包
跟js的执行机制有关,js是单线程的,同一时间只能作一件事,经过事件轮询实现异步的执行,直接调用函数变量之类同步执行会进入到执行栈中,按顺序执行,全部的异步执行,则会放入执行队列,在回调接到相应后,插入到执行栈中执行。
setTimeout是个异步执行的回调,在执行队列中,因此会等全部的for循环任务栈结束后再执行,设置的时间表明当回调执行时,等待多长时间后执行,而不是js解析器读到这段代码,等待多长时间执行,因此有时候还会感受执行时间比给定的时间长。异步
返回值就像上面所说的是定时器编号,因此通常使用定时器,都会给予一个命名,方便之后清除定时器。函数
https://segmentfault.com/q/1010000010351840线程