2016-01-20 64 views
2

我在JavaScript中運行此代碼:爲什麼setTimeout(function,0)在下一次操作後執行,但不是在調用時執行?

setTimeout(function(){console.log("1");}, 0); 
console.log("2"); 

但輸出是:

2 
1 

爲什麼不反過來呢?

+3

由於設定的超時添加回調到事件隊列......所以只有在當前執行線程結束之後纔會調用該函數 –

+0

如果它沒有像那樣工作(並且你的運行函數可能會在兩行之間中斷),你會遇到各種競爭條件與異步代碼。 – Thilo

回答

5

setTimeout()將所有代碼放入一個隊列中,然後再根據時間執行。所以你可以看到作爲一行隊列執行的過程列表。對於上面的代碼,您有:

  1. setTimeout
  2. console.log(2)
  3. 回調函數,如有
    1. console.log(1)

因此,執行第一件事就是,初始化計時器。其次,console.log得到執行,你看到2。在這裏需要注意的一點是,setTimeout waits at least for 4 ms在執行其回調函數之前。

1

當您使用setTimeout()或其朋友之一時,其功能被放置在當前所有代碼完成後執行的隊列中。

應該注意的是,the spec表示最小時間被鉗位到4

1

只是因爲setTimeout方法的回調函數稍後執行。您指定0

  1. 的setTimeout(..)

    Althought回調函數不立即執行。見https://stackoverflow.com/a/779785/2391070

  2. 的console.log( 「2」)// 2

  3. 的setTimeout調用回調的console.log( 「1」)// 1

相關問題