2011-08-30 141 views
-2
var f = 5, d; 

while (f === 5) d = 2; 

alert(d); 

爲什麼這會凍結我的頁面。我認爲只有當頁面在while循環中執行document.write,alert或console.log時(沒有遞增的值和限制),它會凍結頁面,但不會與變量...我是否還需要有一個var i = 0; while (i < 5 &&...只是爲了讓這個工作?爲什麼while while循環會凍結我的頁面?

編輯:我發現這在谷歌的源代碼。此while循環沒有數字限制,但它不凍結頁面:

while (a && !(a.getAttribute && (b = a.getAttribute("eid")))) a = a.parentNode; 
+0

你想完成什麼?在上面的代碼中沒有循環。 –

+0

僅用於測試目的。 – 0x499602D2

回答

2

您編輯成你的問題的谷歌循環在while條件測試的a的價值,它是修改循環內的a值,所以當基於a(或其他條件一個循環將終止a)不再真誠。

while (a && !(a.getAttribute && (b = a.getAttribute("eid")))) a = a.parentNode; 

對於一個循環結束,一些你在循環條件測試某個循環的迭代過程中必須轉變爲falsey值值。它不一定是數字,也可能是其他的東西對他們有一個真實或虛假的概念。

在,谷歌循環,有兩個條件,可以使終止:

  1. a不再truthy(null,未定義,0,假,等...)。
  2. a.getAttribute(「eid」)存在。

因此,基本上這是上行鏈尋找具有getAttribute(「eid」)的第一個父代。當它用完父母檢查或它找到具有該屬性的父母時,它會停止。

0

這是一個無限循環 - 循環永遠不會退出!你需要做一些工作,使循環條件終止,這樣的習慣:

$counter = 0; 
while ($counter++ < 10) { 
    // do something 
} 
alert('loop is finished!'); 

至於: 而(一& &(a.getAttribute & &(B = a.getAttribute(「EID! 「))))a = a.parentNode;

變量a在循環內部發生變化 - 始終向上移動父節點,直到它用完父元素。所以最終循環終止。在你的代碼中不是這樣。

2

因爲f === 5是真的,你永遠不會改變f(在你的循環中),所以你的循環永遠不會停止。

您的循環會重複設置d = 2,但不會更改f。所以你的循環會盡可能快地設置d。這就好像你做了while(true) {...}

0

因爲while表達式總是計算爲true,所以它會嘗試執行循環並永不停止,因爲f永遠不會更改。

2

頁面只有一個線程。如果你的JavaScript永遠不會結束,它永遠不會讓其他任何人使用該線程。

編輯:要回答你的問題編輯:

while (a && !(a.getAttribute && (b = a.getAttribute("eid")))) a = a.parentNode; 

這裏最重要的部分是a = a.parentNode。循環的每次迭代對於a將有不同的值。它基本上穿越了DOM。它將繼續遍歷DOM樹,直到a沒有父節點,或者它找到一個具有eid屬性的元素。

0

只是因爲頁面始終「凍結」時任何 Javascript代碼正在執行。您所聽到的有關document.write的內容不正確。 Javascript運行在單個線程中,只要Javascript線程正在工作,所有當前瀏覽器都會阻止用戶與頁面的交互。

您包含的谷歌代碼片段修改變量a。假設parentNode屬性最終返回null或其他虛假值,循環將終止。

2

您將f設置爲5

然後,只要f5,您將d設置爲2

這將永遠繼續下去,因爲f將永遠5。你不改變f