我在JavaScript中運行此代碼:爲什麼setTimeout(function,0)在下一次操作後執行,但不是在調用時執行?
setTimeout(function(){console.log("1");}, 0);
console.log("2");
但輸出是:
2
1
爲什麼不反過來呢?
我在JavaScript中運行此代碼:爲什麼setTimeout(function,0)在下一次操作後執行,但不是在調用時執行?
setTimeout(function(){console.log("1");}, 0);
console.log("2");
但輸出是:
2
1
爲什麼不反過來呢?
setTimeout()
將所有代碼放入一個隊列中,然後再根據時間執行。所以你可以看到作爲一行隊列執行的過程列表。對於上面的代碼,您有:
setTimeout
console.log(2)
console.log(1)
因此,執行第一件事就是,初始化計時器。其次,console.log
得到執行,你看到2
。在這裏需要注意的一點是,setTimeout
waits at least for 4 ms
在執行其回調函數之前。
當您使用setTimeout()
或其朋友之一時,其功能被放置在當前所有代碼完成後執行的隊列中。
應該注意的是,the spec表示最小時間被鉗位到4
。
只是因爲setTimeout方法的回調函數稍後執行。您指定0
的setTimeout(..)
Althought回調函數不立即執行。見https://stackoverflow.com/a/779785/2391070
的console.log( 「2」)// 2
的setTimeout調用回調的console.log( 「1」)// 1
由於設定的超時添加回調到事件隊列......所以只有在當前執行線程結束之後纔會調用該函數 –
如果它沒有像那樣工作(並且你的運行函數可能會在兩行之間中斷),你會遇到各種競爭條件與異步代碼。 – Thilo