js是單線程,你得setTimeout函數雖然時間設置爲0,可是也是一個異步,他會在任務池中排隊等待js引擎空閒才執行.segmentfault
js的執行是單線程的,都須要排隊去執行的,循環在一瞬間就完成了,即便時間是0,也是在排隊。除非你用閉包去解決這個問題,就能夠一次輸出你想要的了閉包
跟js的執行機制有關,js是單線程的,同一時間只能作一件事,經過事件輪詢實現異步的執行,直接調用函數變量之類同步執行會進入到執行棧中,按順序執行,全部的異步執行,則會放入執行隊列,在回調接到相應後,插入到執行棧中執行。
setTimeout是個異步執行的回調,在執行隊列中,因此會等全部的for循環任務棧結束後再執行,設置的時間表明當回調執行時,等待多長時間後執行,而不是js解析器讀到這段代碼,等待多長時間執行,因此有時候還會感受執行時間比給定的時間長。異步
返回值就像上面所說的是定時器編號,因此通常使用定時器,都會給予一個命名,方便之後清除定時器。函數
https://segmentfault.com/q/1010000010351840線程