호이스팅
사전적 의미 : 끌어올리다
Hoisting은 선언과 밀접한 관련이 있다.
javascript 엔진은 코드를 실행하기 전 단계로 코드 전반에 걸쳐서 선언된 내용들이 있는지를 쭉 훑어보고 발견하는 족족 위로 끌어올린다.
Hosting 성질을 모르면 위의 코드가 오류라고 생각이 들겠지만,
javascript의 Hosting 성질로 변수 선언과 함수 선언을 위로 끌어올려 오류가 발생하지 않는다
함수 선언문은 통째로 올라간 반면에, 함수 표현식은 선언만 올려짐
함수 선언문은 그 자체로 하나의 선언문인 반면에, 함수 표현식은 선언과 할당이 한 문장안에 이루어지는 것으로 분리가 가능하다
함수선언문과 함수표현식
요즘에는 기명 함수표현식을 쓰는일이 거의 없다.
할당 여부 ✔
할당을 하지 않은 경우 => 전체가 호이스팅의 대상
할당을 한 경우 => 함수는 그 자리에 남아 있고 변수만 호이스팅 대상
호이스팅의 여부에 따라 실무에서 엄청난 영향을 줌
협업을 할 경우 소스코드의 길이가 5만줄 이상.
호이스팅에 의해서 두개의 sum 함수 모두 맨위로 끌어올려짐.
나중에 호이스팅 된 함수가 이전 함수를 덮어씌우게 됨.
그 결과 아래의 sum 함수가 살아 남아 양쪽 sum(1,2), sum(3,4) 모두에서 값만 return하는 함수가 실행됨
함수 선언문은 모든 코드는 위에서부터 아래로 읽어내려가며 실행한다라고 하는 지극히 인간적인 상식에서
벗어나 있어, 가독성면에서 매우 좋지 않다.
혼자서 개발할때는 어디서 선언하든지 실행이 가능하다는 편리한 점이 있겠지만,
협업을 할 경우, 다른 개발자가 소스를 파악하고 이해하는데 상당한 저해가 될 수 있다.
맨위에서 부터 읽어가다가 쌩뚱맞게 처음보는 함수를 호출하는 경우(예를 들어 5000번째 줄에 함수를 구현한 경우)
기타 등등의 여러가지 이유들로 인해서 함수 선언문 대신 함수 표현식을 쓸것을 권한다
=> 안전하고 예측가능한 소스가 된다