사실상
function solution() { ... }
function DFS() { ... }
이렇게 따로 따로 되어있는 함수에서 다른 함수 내에 있는 변수 참조하려고 해서 그럼
solution 밖으로 빼면 지역 변수가 아니라 전역 변수가 되어서 DFS에서도 참조 가능해져서 돌아 가는 거
호이스팅 문제일거임. const 변수선언하면 solution 맨 윗단으로 변수가 끌어올려지는데 이때는 값이 선언이 안되어있는 const moves; 와 같은 상태가 됨. 실질적으로 사용되는 27번째 행까지 진행되어야 값이 할당되는거고. 반면 DFS함수도 호이스팅되서 solution함수 맨 위로 끌어올려지는데 여기에서 moves 변수를 사용하지만 아직 27번째 행으로 가지 않았으니 초기화안된 변수 에러가 발생하는거라 봄. moves변수를 solution 함수 맨 위로 올려보거나 매개변수를 이용해서 넘겨보는걸 추천함
solution의 첫번째 for문에서 DFS를 호출하고 있는데, DFS는 첫번째 for문 시점에서 정의되지 않은 moves에 접근하고 있어서 오류가 발생하는 것임.
function은 같은 스코프 내라면 어디에 놓든간에 최상단에 정의한 것과 같지만 var, const, let은 다름. 당연한건데 셋 다 런타임에 결과가 결정되기 때문에 그 전에 변수 결과가 결정되어 있게 만들 수는 없음. 코드상의 변수 선언 전에 접근할 시 var는 undefined일 뿐 접근 자체는 가능하지만 const, let은 오류를 띄움.
const는 흔히 상수로 표현되지만 컴파일 언어의 상수와 달리 런타임에 결과값이 결정되기 때문에 function처럼 스코프 최상위로 올려줄 수 없음.