2016-07-06 2 views
1

나는 아래의 알고리즘을 DOM 트리 DFS에 시도했지만 작동하지 않습니다! DOM 트리의 첫 번째 경로를 확인할 수 있습니다. 왜?!왜 DOM DFS 알고리즘이 작동하지 않습니까?

function DFS(P) // (ScanRegion, Elem, MCF) 
{ 
    P.Elem.setAttribute("Checked", "1"); 

    Children = P.Elem.querySelectorAll("*"); 

    for(I = 0, L = Children.length; I < L; I++) 
     DFS 
     (
      { 
       ScanRegion : P.ScanRegion, 
       Elem  : Children[I] , 
       MCF  : P.MCF 
      } 
     ); 

    return; 
} 

DFS 
(
    { 
     ScanRegion : document.body, 
     Elem  : document.body, 
     MCF  : "Not important in this question :D" 
    } 
); 

디버깅 일 후에 나는 마침내 문제를 발견했습니다. 나는 아래의 코드를 시도하고 DOM 트리의 첫 번째 리프와 브라우저가 재귀 함수의 첫 번째 '반환'을 실행 한 후 상위 함수의 'L'변수가 값을 잃고 ' 0 '. 당신이 자식 함수의 'L'이 '0'(잎은 자식이 없기 때문에 : D)이고 부모 함수에 영향을 미친다고 생각하기 때문에 JS의 변수 범위 문제로 인한 것 같습니다.

는 여기에 내가 시도 디버깅 코드입니다 :

function DFS(P) // (ScanRegion, Elem, MCF) 
{ 
    P.Elem.setAttribute("Checked", "1"); 

    Children = P.Elem.querySelectorAll("*"); 

    L = Children.length; alert(L); // * New 

    for(I = 0; I < L; I++) 
     DFS 
     (
      { 
       ScanRegion : P.ScanRegion, 
       Elem  : Children[I] , 
       MCF  : P.MCF 
      } 
     ); 

    alert(L); // * New 

    return; 
} 

DFS 
(
    { 
     ScanRegion : document.body, 
     Elem  : document.body, 
     MCF  : "Not important in this question :D" 
    } 
); 

중 하나가 문제를 알거나 진정한 코드 :

+0

두 코드가 작동하지 않는 경우, 맞습니까? 두 번째 코드에서 정확히 작동하지 않는 것에 대해 다소 혼란 스럽습니다. – Xufox

+1

두 번째 버전은 디버깅 버전이며 두 가지 이상의 경고 만 표시합니다. – Arvin

+0

어쨌든 주셔서 감사합니다 :) – Arvin

답변

1

var와 지역 변수 선언이 있다면 나는 감사 드리겠습니다! 그대로 서면 I입니다.입니다. L과 동일합니다. 그 때문에 재귀 호출은 부모의 반복을 엉망으로 만든다.

함수의 상단에

var I, L; 

를 추가합니다. 변수 이름에 소문자를 사용하는 것을 고려해보십시오. 자바 스크립트 코드에서 훨씬 더 일반적입니다.

+0

정말 고마워, 내 프로젝트에서 정말 도와 줬어 : - D – Arvin

+0

게다가, 나는 아이들을 위해서도 var을 사용할 필요가있다. – Arvin

+0

@Arvin 예 내가 그 중 하나를 놓친 :) – Pointy

관련 문제