2 回答

TA貢獻1845條經(jīng)驗 獲得超8個贊
其實第二個題目的答案確實一定是:32103210。
之所以后面四個 alert 輸出 的結(jié)果有不確定性,和 setTimeout 以及延遲時間 都沒有關(guān)系,是因為,alert 會阻塞瀏覽器的執(zhí)行線程,而所有阻塞執(zhí)行線程的方式,都會讓setTimeout的結(jié)果具有不確定性。
(即便setTimeout的延遲時間為0,回調(diào)函數(shù)也是嚴格的壓入隊列棧中的,按照FIFO的順序依次調(diào)用。)
比如,打開調(diào)試工具,設置斷點,如果執(zhí)行到延時回調(diào)函數(shù)中斷點生效了,這時,代碼中的 setTimeout setInterval 等結(jié)果也都會受到影響。
遇到這種情況,最好的方式(比如此處),盡量使用【console.log】輸出結(jié)果,這樣只會將對象打印到控制臺,而不會影響時間性和順序。

TA貢獻1835條經(jīng)驗 獲得超7個贊
前邊那個你理解了?那我只說后邊那個——閉包。
(function(i){ setTimeout(function(){ alert(i); },0); })(len);
這里創(chuàng)建了一個函數(shù)并立即調(diào)用了,函數(shù)的參數(shù) i
被設置成 len
現(xiàn)在的值,然后它就不改了。所以它 alert
的值是 0-3 而不是 -1。
至于順序,都是延時 0 毫秒執(zhí)行,所以順序是亂的。
添加回答
舉報