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

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

alert(d); 

왜 내 페이지가 정지됩니까? 나는 페이지가 document.write, alert 또는 console.log를 while 루프 안에 넣을 때 (제한이있는 값을 증가시키지 않고) 페이지를 고정시킬 것이지만 변수를 사용하지 않을 것이라고 생각했다. 이 기능을 사용하려면 var i = 0; while (i < 5 &&...이 필요합니까?내 페이지를 루프 고정하는 이유는 무엇입니까?

편집 : Google의 소스 코드에서이를 발견했습니다. 이 while 루프에는 개수 제한이 없지만 페이지가 고정되지 않습니다.

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

달성하려는 작업은 무엇입니까? 위의 코드에 루프가있는 것은 아닙니다. –

+0

테스트 목적으로 만 사용하십시오. – 0x499602D2

답변

2

당신이 당신의 질문에 편집 한 구글 루프는 동안 조건에 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

루프가 종료되지 않습니다. 당신은 루프 상태가 종료하기 위해 뭔가를 할 필요가,이 같은 관례 : 동안의 (a & & (a.getAttribute & & (B = a.getAttribute ("이드!

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

에 관해서 "))))) a = a.parentNode;

변수 a이 루프 내부에서 변경됩니다. 상위 요소가 부족해질 때까지 부모 노드를 항상 위로 이동합니다. 그래서 결국 루프가 종료됩니다. 코드에서는 그렇지 않습니다. 이 true이고 f (루프 내부)을 변경하지 않으므로

2

이므로 루프가 중단되지 않습니다.

루프가 반복적으로 d = 2으로 설정되지만 그 값은 f으로 변경되지 않습니다. 따라서 루프는 계속해서 최대한 빨리 d으로 설정합니다. 마치 while(true) {...} 일 것입니다.

0

while 표현식은 항상 true로 평가되므로 f이 절대로 변경되지 않으므로 루프를 실행하려고 시도하고 중지하지 않습니다.

2

페이지에 대해 하나의 스레드 만 있습니다. 귀하의 자바 스크립트가 끝나지 않으면 결코 다른 스레드가 스레드를 사용할 수 없습니다.

편집 :

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

여기서 중요한 부분은 a = a.parentNode이다 : 편집 한 질문에 대답합니다. 루프의 각 반복에는 a에 대해 다른 값이 있습니다. 이것은 기본적으로 DOM을 트래버스하는 것입니다. 부모가 없거나 eid 속성이있는 요소를 찾을 때까지 DOM 트리를 계속 트래핑합니다.

0

자바 스크립트 코드가 실행 중일 때만 페이지가 항상 "고정"되기 때문입니다. document.write에 대해 들었던 내용이 잘못되었습니다. Javascript는 단일 스레드에서 실행되며 Javascript 스레드가 작동하는 한 모든 현재 브라우저는 페이지와의 사용자 상호 작용을 차단합니다.

포함 된 Google 코드 스 니펫은 변수 a을 수정합니다. parentNode 속성이 결국 null 또는 다른 거짓 값을 반환한다고 가정하면 루프가 종료됩니다.

2

f5으로 설정합니다.

그런 다음 f5 인 경우 d2으로 설정합니다.

f은 영원히 5이 될 것이므로이 내용은 영원히 계속 될 것입니다. f을 변경하지 마십시오.

관련 문제