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 라는 함수가 만들어지기도 전에, 호출을 해서 발생하는 에러 이다.
// =============================
/*
[ 정리 ]
기본적으로 함수라는 것은 복잡한 구현을 어떠한 함수를 정의 해서 기능을 추상화 한것을 말한다.
그러니까, 이러한 관점에서 보았을 때, 어떠한 함수명을 보면,
일단, "아 ~ 이 함수는 이런 기능을 하는구나" 라는 것을 알 수 있다.
즉, 함수의 구현부를 굳이 먼저 볼 (읽을) 필요가 없다는 것이다.
그래서, 함수를 먼저 호출을 해버리고, "아 ? 이러한 함수가 사용되네 ?" 를 보고 나서,
자세한 함수 기능 구현부는 자바스크립트 코드의 제일 아래쪽에 작성함으로써,
필요할 때, 나중에 읽을 수 있도록 코드를 작성 하는 관점 이라고 볼 수 있다.
이렇게 코드를 작성 할 수 있도록 하는 개념이 바로 '호이스팅' 이다.
정리하자면,
함수 선언(문) 의 스타일로 함수를 정의 해야, '호이스팅' 개념을 사용 할 수 있다.
함수 표현식의 스타일은 '호이스팅' 개념을 사용 할 수 없다.
이런식으로 코드를 작성하는것이 필수는 아니고, 취향 차이 지만,
이러한 관점을 가지고 자바스크립트 코드를 짜는 개념을 알아 두자.
*/
반응형
'자바스크립트 (JavaScript) > 이론' 카테고리의 다른 글
[ 함수 ] 매개변수 패턴 (0) | 2023.11.06 |
---|---|
[ 함수 ] 반환 및 종료 (0) | 2023.11.05 |
[ 연산자와 구문 ] While, Do while 반복문 (0) | 2023.11.05 |
[ 연산자와 구문 ] For, For of, For in 반복문 (0) | 2023.11.03 |
[ 연산자와 구문 ] If, Switch 조건문 (0) | 2023.11.03 |