본문 바로가기
자바스크립트 (JavaScript)/이론

[ 함수 ] 선언과 표현 그리고 호이스팅

by Hwanii_ 2023. 11. 5.
728x90
//  함수 (Function)

//  함수 선언문 (Declaration)

function hello() {
    //  pass
}

//  =============================

//  함수 표현식 (Expression)

//  일반적으로 함수를 만들 때, function 키워드를 사용 해서 함수를 선언 한다.
//  이렇게 정의 하는 함수 선언과, 함수 표현식 모두 동일 하게 함수를 만드는 것이다.
//  그런데, 함수 표현식은 const 또는 let 키워드를 통해서,
//  변수에 이름을 지정하고 거기다가 할당 연산자를 통해서 function 키워드로 시작하는 함수를 할당 한다.
//  즉, 변수에 함수를 대입 ( == 저장 == 할당 ) 하는 것이다.

const hello2 = function () {
    //  pass
}

//  함수 선언문과 함수 표현식의 큰 차이로,
//  함수 선언문은 함수 자체가 이름이 존재 한다.
//  하지만,
//  함수 표현식은 이름이 없는 함수 이다. ( == 무명 함수 == 익명함수 )
//  이러한 이름이 없는 함수를 const 또는 let 키워드로 선언된 변수에 대입 한다.

//  [ 사용 방법 ]

//  사용 방법은 어떻게 될까 ?
//  함수 선언문과 함수 표현식 모두 사용 방법은 '동일' 하다.

hello()
hello2()

//  위와 같이 함수를 호출 하면 된다.

//  =============================

//  그런데 사실 아주 중요한 차이점이 존재 한다.
//  '호이스팅' 이라는 개념 이다.

//  호이스팅 (Hoisting)

function hi() { //  함수 선언(문)
    console.log('Hi ~')
}

hi()    //  Hi ~

//  위의 코드를 보면 이질감이 아예 없다.
//  hi 라는 이름을 가진 함수를 선언 했고,
//  밑에서 hi() 를 작성 해서 해당 함수를 호출 한다.

//  그런데 아래의 상황을 보자.

test()  //  Test !

function test() {
    console.log('Test !')
}

//  test 라는 함수를 선언을 하기 전에, test() 를 작성해서 함수를 호출 했는데,
//  컴파일 에러 라던지, 런타임 에러 라던지,
//  암튼 뭐가 발생 하지 않고, 정상적으로 작동 한다.

//  이것은 함수 선언에서 호이스팅 이라는 현상이 발생 해서 그런것이다.

//  호이스팅 : (함수가) 선언되어져 있는 코드를,
//  선언 부분 내에서 유효한 범위 내의 맨 꼭대기로 끌어올려서 동작을 하는 개념 이다.

//  그런데 이 호이스팅 현상은 '함수 선언문' 에서만 발생 하고, '함수 표현식' 에서는 발생 하지 않는다.

//  =============================

//  아래를 확인해보자.

// test02()    //  Uncaught ReferenceError : Cannot access 'test02' before initialization

const test02 = function () {
    console.log('Test02 !')
}

//  레퍼런스 에러가 발생 한다.
//  test02 라는 함수가 만들어지기도 전에, 호출을 해서 발생하는 에러 이다.

//  =============================

/*
[ 정리 ]
기본적으로 함수라는 것은 복잡한 구현을 어떠한 함수를 정의 해서 기능을 추상화 한것을 말한다.
그러니까, 이러한 관점에서 보았을 때, 어떠한 함수명을 보면,
일단, "아 ~ 이 함수는 이런 기능을 하는구나" 라는 것을 알 수 있다.
즉, 함수의 구현부를 굳이 먼저 볼 (읽을) 필요가 없다는 것이다.
그래서, 함수를 먼저 호출을 해버리고, "아 ? 이러한 함수가 사용되네 ?" 를 보고 나서,
자세한 함수 기능 구현부는 자바스크립트 코드의 제일 아래쪽에 작성함으로써,
필요할 때, 나중에 읽을 수 있도록 코드를 작성 하는 관점 이라고 볼 수 있다.
이렇게 코드를 작성 할 수 있도록 하는 개념이 바로 '호이스팅' 이다.
정리하자면,
함수 선언(문) 의 스타일로 함수를 정의 해야, '호이스팅' 개념을 사용 할 수 있다.
함수 표현식의 스타일은 '호이스팅' 개념을 사용 할 수 없다.

이런식으로 코드를 작성하는것이 필수는 아니고, 취향 차이 지만,
이러한 관점을 가지고 자바스크립트 코드를 짜는 개념을 알아 두자.
 */

 

반응형