2013-02-19 48 views
0

我很困惑,爲什麼下面的HTML不工作。 我期望它會繼續發送警報,但它會在一次後停止。 此外,「左fn」警報從不發生! 任何人都可以解釋這個給我嗎? 我在Ubuntu上使用Firefox中的html5。html5和javascript:是setTimeout打破這個?

<!DOCTYPE html> 
    <script> 
     function alertme() { 
     alert ("in fn"); 
     } 

     while (true) { 
     window.setTimeout(alertme(), 3000); 
    alert("left fn"); 
     } 
    </script> 
+0

你想做什麼? alert(「in fn」)總是顯示的唯一原因是alert(「left fn」)'將控制權返回給循環內部的瀏覽器。如果你在循環中沒有提醒,循環就會開始超時並永不結束,所以超時事件永遠不會被處理。瀏覽器會凍結。 – Guffa 2013-02-19 23:53:47

+0

@Guffa謝謝,好點。我也在setTimeout停止執行的印象。 – fletchervk 2013-02-20 00:30:50

+0

基於閱讀「關於」鏈接,我對這個網站的理解是,我應該投票給喬納森的「最佳」答案。 @ clph3r對不起,如果可以的話,我也會爲你投票的。 – fletchervk 2013-02-20 00:32:54

回答

2

幾個可能的問題:

  1. alertme()被立即調用其return值代替被傳遞到setTimeout()

    爲了解決這個問題,你可以通過alertme作爲參考(不調用括號):

  2. 但是,這會再與JavaScript的(主要)單線程性質的衝突。

    setTimeout() S,是異步的,簡單地啓動,現在到期不小於3秒從的計時器。但是,它們要求最後一個線程而不是忙於執行延遲任務。

    但是,while (true) {}是同步且不確定的,它將使線程保持忙碌狀態,直到所有執行都停止,並且永遠不會允許超時執行任務。所以,你永遠不會看到"in fn"

    約翰Resig的有一個很好的寫了有關定時器:http://ejohn.org/blog/how-javascript-timers-work/

究竟如何修復代碼依賴於意圖。

+0

謝謝,這是一個非常有益的迴應。所以......我是新來的。有兩個有效的答案,一個更快,另一個更徹底,誰得到複選標記? – fletchervk 2013-02-20 00:12:32

2
while (true) { 
    window.setTimeout(alertme, 3000); //setTimeout wants a function, not the return value of the function 
    alert("left fn"); 
} 

順便說一句,有klicking所有的消息框遠樂趣...

+0

哇,反應很快。我很高興這很簡單。我正在通過試驗和錯誤學習JavaScript。每個都有很多。非常感謝! – fletchervk 2013-02-19 23:51:20

+0

+1對'有樂趣' – metadings 2013-02-19 23:54:17