這聽起來像你期待的JS是多線程的,但它不是,這使得某些事情真棒。例如,如果JS是多線程的,下面會做什麼?
if (x === 3) {
alert(x);
}
在JS的答案是「它警告3」,但如果JS是多線程的,就什麼也沒有從IF和警報之間的編輯X停止另一個線程,所以它不會被明確定義。
您可以控制權返回給瀏覽器的事件循環,同時確保一些代碼運行,通過調度該功能,無論是與setTimeout
或setInterval
。如果您希望遞歸的結果是異步的,這也可以讓您在沒有大量調用堆棧的情況下執行遞歸。此外,JS正在獲得一項新功能(生成器和yield
關鍵字),這將使它更容易「暫停」中間某個功能,以便稍後恢復。
做你想做什麼,最簡單的方法是:
var i = 0, running = true;
function iter() {
if (running && i < 100000) {
console.log("hi", i++);
setTimeout(iter, 0);
}
}
iter();
您也可以在setTimeout調用使用一個非零時間 - 例如人類的反應時間大約是200毫秒,所以如果你只是需要它從人類的角度來看似乎是連續的,請將0
更改爲100
;它會給你的電腦多一點空間來呼吸。
你也可以使用setInterval
,但要知道如果一些CPU密集型函數阻塞了其他一段時間的執行,你將排隊一堆相同的函數,它們都希望一個接一個地執行。當setTimeout線程調用setTimeout時,有一個最小延遲,它由setTimeout強制執行; setInterval並不是這種情況(它聲稱調用之間的平均時間是一致的,但沒有聲明它們之間的最小或最大延遲)。
爲了setInterval
的緣故,您可能希望在某點之後停止間隔。在i
上加上if
檢查當然會使該函數成爲一個空功能,它什麼都不做,所以它不會浪費太多時間,但是如果你不想調度它,捕獲setInterval
的結果並將它傳遞給clearInterval
。
您的代碼不會更改循環內的「stop」 – hindmost 2014-10-10 14:03:32
JavaScript是單線程的。你的事件處理程序(我想)將'stop'設置爲'true'只會在while循環完成後執行。 – techfoobar 2014-10-10 14:03:42
@最後我改變停止在循環外的值... – user2422900 2014-10-10 14:18:23