일반적으로 코드는 위에서 아래로 순서대로 진행된다. 호이스팅이란 순서상으로는 선언하지 않았지만, 아래에서 선언된 변수나 함수를 위쪽에서 사용할 수 있는 현상을 말한다.
console.log(num)을 실행할 당시에는add라는 함수가 정의되어 있지 않은 상태인데, console에30이라는 값이 찍힌다.
const num = add(10, 20);
console.log(num); // 30
function add(a, b) {
return a + b;
}
const나let은var와 같이undefined가 아닌Error가 뜨기 때문에호이스팅이 되지 않는 것처럼 보이지만, 사실은 그렇지 않다.const나let도호이스팅을 지원하지만 다른 기능을 가지고 있다.
console.log(hello); // undefined
var hello = 10;
console.log(hello); // 10
---------------------------------
var hello;
console.log(hello); // undefined
hello = 10;
console.log(hello); // 10
console.log(hello); // Error!
const hello = 10;
// or let hello = 10;
코드를 선언하는 구문에 도달하기 전에는, 변수를 사용하게 할 수 없도록 하게하는 기능이다. 호이스팅을 지원하지 않는 것이 아니다.
print2함수 내부에서 선언한hello와 전역에서 선언한hello는 다르다.print1함수에서는 전역에서 선언한hello변수를 가져와서 사용했지만,print2함수에서는hello변수를 새롭게 선언했는데console.log(hello)가 변수를 선언하기 전에 실행되기 때문에print2함수 내부의hello변수를 사용하지 못하고Error를 출력한다.
const hello = 100;
function print1() {
console.log(hello); // 100
}
function print2() {
console.log(hello); // Error!
const hello = 200;
}
아래에서
add()함수를 선언할 때, 목적에 따라 어느 위치에서 선언하는 것이 바람직한지 알아보려고 한다. 외부에서 함수를 사용하지 않을 생각이라면 불필요한 코드는 작성하지 않는 것이 좋기 때문에[4]번과 같이export를 사용할 필요는 없다.main()함수 뿐만 아니라,main2()나main3()함수에서도add()함수를 사용한다면,[3]번 위치에서 작성하는 것이 재사용성을 위해서 좋다.main()함수 내에서만add()함수를 사용한다면[1]번과[2]번에서 함수를 선언하는 것이 더 적절하다.[2]번이 가능한 이유는 자바스크립트에서 함수의 호이스팅이 가능하기 때문이다.[1]번과[2]번 중 선택하는 것은 개발자의 선택에 따라 갈리는 문제인데,main()함수를 실행함에 있어서add()함수가 중요하거나 개발자가 보고 이해가 필요한 경우라면[1]번에 위치하는 것이 좋지만,add()함수와 같은 경우는 함수의 이름만 봐도 함수의 목적이 분명하고,main()함수와 직접적인 연관성이 있는 경우가 아니기 때문에[2]번에 위치해서 시선을 분산시키지 않는 것도 좋은 방법이다.
function main() {
// [1]
function add(n1, n2) {
return n1 + n2;
}
const result = add(3, 4);
// [2]
function add(n1, n2) {
return n1 + n2;
}
}
function main2() { ... }
function main3() { ... }
// [3]
function add(n1, n2) { ... }
// [4]
export function add(n1, n2) { ... }