2014-12-24 2 views
2

아래의 코드로 Internet Explorer가 멈추는 경우가 있습니다. 과제로 학생 성적을 처리하는 프로젝트입니다.IE 동결을 야기하는 JavaScript 코드

var array1 = StudentGradeAreadHugeList(); 

var nextArrayItem = function() { 
    var grade = array1.pop(); 

    if (grade) { 
     nextArrayItem(); 
    } 
}; 

희망이 있으시면 도와주세요.

답변

2

당신이하려는 응용 프로그램에 대한 자세한 정보를 표시 할 수 있습니다. 하지만 스택 오버플로 (아마도 큰 목록을 사용하고있는 것)의 문제라고 생각합니다. 빅 데이터에서 주로 발생시키지

window.setTimeout (nextArrayItem, 0)

동결을,하지만 지금은 이벤트 루프는 재귀 과정이 아니라 귀하의 호출 스택을 처리합니다 : 그래서, 당신은 "nextArrayItem"을 수정해야한다는 극복하기 위해.

0

이것은 무한 재귀 때문에 발생했을 가능성이 큽니다. IE에서 반환 값의 적절한 취급에 유의하십시오

var array1 = StudentGradeAreadHugeList(); 

var nextArrayItem = function() { 
    var grade = array1.pop(); 

    if (grade !== null && typeof(grade) !== "undefined") { 
     nextArrayItem(); 
    } 
}; 

pop()를 빈 상태 (empty)의 배열에 false하지만 유형이없는 "정의되지 않은"부울 반환하지 않습니다.

0

여기에 두 가지 문제가있다 :

  1. 당신은 호출 스택 제한
  2. 를 초과 할 수 귀하의 설정되어있는 경우 조건부 잘못

을 첫 번째 문제의 경우 : 로 이전 응답자 중 하나인데, 매우 큰 목록이있는 경우 각 요소에 대한 재귀 호출을 수행해야하므로 호출 스택의 한계를 초과 할 수 있습니다. setTimeout을 실행하는 동안 해킹과 같은 해결책이 될 수 있습니다. 실제 문제는 함수가 배열을 반복적으로 처리하는 것이 아니라 반복적으로 처리하는 것입니다. for-loop를 사용하여 함수를 다시 작성하는 것이 좋습니다. 두 번째 문제를 들어

:

은의 당신의 배열이 [100, 90, 80]로 설정이 경우 가정 해 봅시다. nextArrayItem()을 호출하면 처음 두 번 제대로 작동하지만 nextArrayItem() 번으로 전화를 걸면 마지막으로 남은 항목 (이 경우 100)이 튀어 나오고 성적은 100으로 설정됩니다.이 값은 사실 값입니다. 따라서 if-conditional이 전달되고 배열이 이제 비어 있어도 프로그램이 호출 스택을 종료해야한다는 사실에도 불구하고 함수가 잘못된 호출을 다시 시도합니다.

크롬에서 예제를 사용하여 코드를 테스트 해 보았습니다. 그 중 하나가 너무 많이 반복되어 빈 배열에서 pop을 호출하면 정의되지 않은 값이 반환됩니다.

어레이를 마지막으로 검사하기 위해 if 조건을 변경하여 을 수정하여이 문제를 해결할 수 있습니다.

var nextArrayItem = function() { 
    var grade = array1.pop(); 

    if (array1[array1.length-1]) { 
     nextArrayItem(); 
    } 
}; 
:

수정 된 코드를 참조하십시오