2010-07-13 71 views
3

至於原因,完全超出了我的理解,這個功能運行得很好:由無警報觸發無限循環()

function foo() { 
    var loop = true; 
    var abc = ["a","b","c"]; 
    var ctr = 0; 
    while(loop) { 
     $("<img />").error(function() { 
      loop = false; 
     }).attr('src','images/letters/'+abc[1]+(ctr++)+".jpg"); 
     alert(ctr); 
    } 
} 

但移動whilealert(ctr)觸發無限循環。

function foo2() { 
    var loop = true; 
    var abc = ["a","b","c"]; 
    var ctr = 0; 
    while(loop) { 
     $("<img />").error(function() { 
      loop = false; 
     }).attr('src','images/letters/'+abc[1]+(ctr++)+".jpg"); 
    } 
    alert(ctr); 
} 

任何人都可以幫助澄清?

+1

我真的不明白這個功能的意義......請你解釋一下多一點,所以也許我們能找到另一個解決方案? – oezi 2010-07-13 05:15:24

+0

夥計們,非常感謝你的迅速回復。我應該猜到這次活動沒有機會開火,並且很高興得到社區的肯定。 @oezi - 腳本正在通過停止計數來檢查實際存在的圖像,一旦發生'onerror'事件。 – Impirator 2010-07-13 05:50:21

回答

3

我會很強大的警惕做你正在做什麼的。你看,你基本上正在旋轉一個無限循環,依靠JS引發的一個error事件來中斷該循環。我想你正在看到上述行爲,因爲撥打alert()正在抽取信息,並給事件發生的機會。在後面的例子中,你只是在旋轉CPU,而沒有給其他任何事情發生機會。

3

在你的第一個片段,內循環alert函數調用導致暫時停止它,想必讓時間來error回調來執行,該loop標誌設置爲false

在你的第二個片段,當alert的通話不是while內目前,循環將執行多次,發射瀏覽器的long-running script warning

+0

這是對的,我只是不能指定兩個正確的答案。謝謝,CMS。 – Impirator 2010-07-13 05:47:30

0

不明白爲什麼,但似乎是在第2個的情況下,對某些原因變量範圍的查詢股價。

0

在大多數瀏覽器,沒有什麼會(通過警告你的情況)被寫入到頁面,直到用戶明確給出控制和JavaScript達到很自然的結論。 .error()不會在沒有警報的情況下暫停循環。

是否可以寫一個for循環給出ABC的長度?

1

JavaScript是單線程的共時性。如果刪除了警報,則循環將使其保持繁忙狀態,並且不會引發錯誤(實際上它將排隊),直到處理結束。警報使您的無限循環暫停一段時間,並讓Javascript處理排隊的事件。