node · JavaScript
오류 문구
RangeError: Maximum call stack size exceeded
무슨 뜻인가
호출이 쌓이는 깊이가 엔진의 한도를 넘었다는 뜻이고, 대개 깊은 재귀가 아니라 끝나지 않는 재귀입니다. 멈추는 조건이 없거나 닿지 않는 함수, 서로를 부르는 두 함수, 자기 자신을 담고 있는 객체를 JSON.stringify로 넘기는 경우, React라면 렌더 중에 자기가 의존하는 상태를 바꾸는 경우가 원인입니다. 콘솔의 스택에서 되풀이되는 두세 프레임을 보면 고리가 바로 보이니, 거기서 멈추는 조건을 고치세요. 깊이가 정말 필요한 계산이라면 재귀를 반복문이나 명시적인 스택으로 바꾸는 것이 유일한 길입니다 — 브라우저의 스택 한도는 늘릴 수 없습니다.
고치는 명령
한 줄 명령으로 끝나지 않습니다. 설명에 무엇을 봐야 하는지 적어 두었습니다.
- 내는 도구
- node
- JavaScript
- 15
브라우저와 node의 오류는 대개 무엇이 잘못되었는지만 알려 주고 왜 그 값이 그렇게 되었는지는 알려 주지 않아서 — undefined를 읽었다, 함수가 아니었다, JSON이 아니었다 — 고칠 자리는 터진 줄이 아니라 그 값을 만든 위쪽에 있고, ?.와 기본값으로 그 줄만 조용하게 만들면 같은 문제가 더 먼 곳에서 더 알아보기 어려운 꼴로 다시 나타납니다.
오류 문구를 읽는 법
- 첫 줄부터 읽습니다. 아래로 갈수록 도구 내부 이야기이고, 정작 원인은 맨 위에 적혀 있습니다.
- 파일 이름과 줄 번호가 있으면 거기가 시작점입니다 — 스택의 가장 위가 아니라, 내가 쓴 파일이 나오는 가장 위 줄입니다.
- 문구를 그대로 검색합니다. 다만 내 경로와 변수 이름은 지웁니다 — 그 부분이 검색을 방해합니다.
- 같은 문구가 도구 판마다 다르게 나옵니다. 검색 결과가 안 맞으면 판 번호를 함께 넣어 봅니다.
- 고치는 명령을 붙여 넣기 전에 그 명령이 무엇을 버리는지 확인합니다. 되돌릴 수 없는 것이 섞여 있습니다.
자주 묻는 질문
Q. RangeError: Maximum call stack size exceeded 는 무슨 뜻인가요?
호출이 쌓이는 깊이가 엔진의 한도를 넘었다는 뜻이고, 대개 깊은 재귀가 아니라 끝나지 않는 재귀입니다. 멈추는 조건이 없거나 닿지 않는 함수, 서로를 부르는 두 함수, 자기 자신을 담고 있는 객체를 JSON.stringify로 넘기는 경우, React라면 렌더 중에 자기가 의존하는 상태를 바꾸는 경우가 원인입니다. 콘솔의 스택에서 되풀이되는 두세 프레임을 보면 고리가 바로 보이니, 거기서 멈추는 조건을 고치세요. 깊이가 정말 필요한 계산이라면 재귀를 반복문이나 명시적인 스택으로 바꾸는 것이 유일한 길입니다 — 브라우저의 스택 한도는 늘릴 수 없습니다.
Q. 어떻게 고치나요?
한 줄 명령으로 끝나지 않습니다. 위 설명에서 무엇을 봐야 하는지 적어 두었습니다.
Q. 어느 도구가 내는 오류인가요?
node입니다. JavaScript 갈래에 있고, 문구는 6낱말입니다.