>  기사  >  웹 프론트엔드  >  JS 함수 호출 스택 크기 계산 방법에 대해

JS 함수 호출 스택 크기 계산 방법에 대해

不言
不言원래의
2018-06-29 10:35:532641검색

이 글은 JS 함수 호출 스택 크기 계산 방법에 대한 관련 지식 포인트를 공유합니다. 관심 있는 친구는 이 글을 참고할 수 있습니다.

축하합니다. 계속 호출하는 무한 루프를 작성하면 곧 다음과 같은 오류가 표시됩니다. Uncaught RangeError: Maximum 호출 스택 크기가 초과되었습니다. 그렇다면 호출 스택 크기는 얼마입니까?

1. 계산 방법

다음 방법을 사용하면 사용 중인 JavaScript 엔진에서 호출을 얼마나 지원할 수 있는지 계산할 수 있습니다(Ben Alman의 코드에서 영감을 얻음):

function computeMaxCallStackSize() {
    try {
      return 1 + computeMaxCallStackSize();
    } catch (e) {
      // Call stack overflow
      return 1;
    }
  }

결과는 다음과 같습니다.

  • Node.js: 11034

  • Firefox: 50994

  • Chrome: 10402

이 숫자는 무엇을 나타냅니까? Mr.Aleph는 V8에서 호출 가능한 레이어의 수가 두 가지 측면에 기초한다고 말했습니다: 1. 스택의 크기 2. 각 스택 프레임의 크기(함수 매개변수 및 로컬 변수를 기록하는 데 사용됨). ComputeMaxCallStackSize에서 지역 변수를 선언하여 테스트해 보면 그 수가 작아지는 것을 확인할 수 있습니다.

2. ECMAScript 6의 꼬리 재귀 최적화

ECMAScript 6은 꼬리 재귀 최적화를 지원합니다. 함수의 마지막 작업이 함수 호출인 경우 "하위 호출" 대신 "점프"가 사용됩니다. 즉, ComputeMaxCallStackSize를 다음 형식으로 다시 작성하면 항상 ES6 엄격 모드에서 실행됩니다.

function computeMaxCallStackSize(size) {
    size = size || 1;
    return computeMaxCallStackSize(size + 1);
  }

3. 댓글 강조 표시

Andrei: "ECMAScript 6" 버전의 코드는 전혀 작동하지 않습니다. 크기가 변경되더라도 결국에는 값이 반환되지 않습니다.

Andrei에게 답장하기: 흥미롭네요! 이 코드를 사용하여 스택 크기를 계산할 수 없습니다. ES6에서는 이 코드가 영원히 실행되므로 데이터가 반환되지 않습니다. 다른 경우에는 RangeError가 반환됩니다. 이를 작동시키기 위해 코드를 다시 작성했습니다.

var computeMaxCallStackSize = (function() {
 return function() {
  var size = 0;
  function cs() {
   try {
    size++;
    return cs();
   } catch(e) {
    return size + 1;
   }
  }
  return cs();
 };
}());

위 내용은 모두의 학습에 도움이 되기를 바랍니다. 중국사이트!

관련 권장 사항:

동적으로 추가된 레이블 개체를 얻기 위한 jQuery 구현

WeChat 애플릿에서 javascript로 데이터를 가져오는 방법

iframe이 JS를 통해 로드되는지 판단하는 방법

위 내용은 JS 함수 호출 스택 크기 계산 방법에 대해의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.