首先js是單線程,任務隊列採用「先進先出」,所以前面的任務不執行完,後面的任務是沒法執行的,會形成阻塞。函數
咱們都知道該函數接受兩個參數,第一個參數爲字符串或者函數,第二個爲延遲的時間,單位爲毫秒。之前我一直認爲若是後面的參數爲2000,那麼兩秒後該函數就會執行。可實際上並非這樣。你應該這樣理解,settimeout函數是在指定的延遲時間後,將該任務加入到js的任務隊列中,具體執行的時間取決於任務隊列中位於該任務前面全部任務的執行時間。線程
let a = 1; settimeout(function(){ console.log(1111); },1000); while(a>0){ a++ }
以上代碼永遠也不會輸出1111。1s後任務加入到任務隊列,由於前面是死循環,永遠也執行不完,因此後面的語句沒法執行。若是延遲時間爲0,會出現什麼情況?code
setTimeout(function(){ console.log(1111); },0); fun one();
即便延遲變爲0,也是先執行fun one()函數,而後輸出1111。隊列
那麼問題來了,在延遲爲0的狀況下,fun one()執行100遍,結果會是怎麼樣的?字符串
setTimeout(function(){ console.log(1111); },0); fun one(); fun one(); fun one(); fun one(); ...
無論後面有多少個函數,setTimeout裏面的函數老是最後執行,即便延遲爲0。有點奇怪,延遲參數設爲0,也要排到後面。io
最後須要說的一點就是,setTimeout函數用的是eval()函數,若是傳入字符串,會被解析爲函數語句執行,可是這存在必定的風險,因此setTimeout最好是傳入函數,而不是字符串。console