[javascript] 최대 호출 스택 크기가 오류를 초과했습니다

DWR (Direct Web Remoting) JavaScript 라이브러리 파일을 사용하고 있으며 Safari (데스크톱 및 iPad)에서만 오류가 발생합니다.

그것은 말한다

최대 통화 스택 크기를 초과했습니다.

이 오류는 정확히 무엇을 의미하며 완전히 처리를 중지합니까?

또한 대한 수정 Safari실제로에 브라우저 ( iPad Safari, 그것은 말한다

JS : 실행 시간 초과

내가 생각하는 것은 동일한 호출 스택 문제라고 가정합니다)



답변

즉, 코드의 어딘가에서 호출 스택 한계에 도달 할 때까지 다른 함수 등을 호출하는 함수를 호출하고 있음을 의미합니다.

이것은 거의 항상 기본 사례가 충족되지 않는 재귀 함수 때문입니다.

스택보기

이 코드를 고려하십시오 …

(function a() {
    a();
})();

몇 번의 호출 후 스택은 다음과 같습니다.

웹 검사기

보다시피, 호출 스택은 브라우저 하드 코딩 된 스택 크기 또는 메모리 소모와 같은 한계에 도달 할 때까지 증가합니다.

그것을 고치려면 재귀 함수에 기본 케이스가 있는지 확인하십시오 …

(function a(x) {
    // The following condition 
    // is the base case.
    if ( ! x) {
        return;
    }
    a(--x);
})(10);


답변

실수로 동일한 자바 스크립트 파일을 실수로 두 번 가져 오기 / 포함하면 관리자의 리소스 탭에서 확인할 가치가 있습니다.


답변

필자의 경우 값 대신 입력 요소를 전송했습니다.

$.post( '',{ registerName: $('#registerName') } )

대신에:

$.post( '',{ registerName: $('#registerName').val() } )

이렇게하면 Chrome 탭이 고정되어 페이지가 응답하지 않을 때 ‘대기 / 종료’대화 상자가 표시되지 않습니다 …


답변

코드 어딘가에 재귀 루프가 있습니다 (즉, 스택이 가득 찰 때까지 결국 스스로 호출하는 함수).

다른 브라우저는 더 큰 스택을 가지고 있기 때문에 대신 타임 아웃을 얻거나 어떤 이유로 오류를 삼킨다 (트립 캐치가 잘못되었을 수 있음).

오류가 발생하면 디버거를 사용하여 호출 스택을 확인하십시오.


답변

스택 오버플로 감지의 문제는 때때로 스택 추적이 풀리고 실제로 무슨 일이 일어나고 있는지 볼 수 없다는 것입니다.

Chrome의 최신 디버깅 도구 중 일부가 유용한 것으로 나타났습니다.

히트 Performance tab, 확인 Javascript samples가능하고이 같은 것을 얻을 것이다.

오버플로가 어디에 있는지는 분명합니다! 를 클릭 extendObject하면 실제로 코드에서 정확한 줄 번호를 볼 수 있습니다.

여기에 이미지 설명을 입력하십시오

도움이 될 수도 있고 아닐 수도있는 타이밍도 볼 수 있습니다.

여기에 이미지 설명을 입력하십시오


실제로 문제를 찾을 수없는 경우 유용한 또 다른 요령은 문제가 console.log있다고 생각되는 곳에 많은 진술을하는 것입니다. 위의 이전 단계가 도움이 될 수 있습니다.

Chrome에서 동일한 데이터를 반복적으로 출력하면 문제가 더 분명한 위치를 나타내는 다음과 같이 표시됩니다. 이 경우 스택은 마침내 충돌하기 전에 7152 프레임에 도달했습니다.

여기에 이미지 설명을 입력하십시오


답변

필자의 경우 다음을 사용하여 큰 바이트 배열을 문자열로 변환했습니다.

String.fromCharCode.apply(null, new Uint16Array(bytes))

bytes 스택에 맞추기에는 너무 큰 수백만 개의 항목이 포함되어 있습니다.


답변

필자의 경우 클릭 이벤트가 하위 요소에서 전파되었습니다. 그래서 다음을 넣어야했습니다.

e.stopPropagation ()

클릭 이벤트시 :

 $(document).on("click", ".remove-discount-button", function (e) {
           e.stopPropagation();
           //some code
        });
 $(document).on("click", ".current-code", function () {
     $('.remove-discount-button').trigger("click");
 });

HTML 코드는 다음과 같습니다.

 <div class="current-code">
      <input type="submit" name="removediscountcouponcode" value="
title="Remove" class="remove-discount-button">
   </div>