JavaScript

자바스크립트 함수 선언문과 함수 표현식의 차이점은 무엇인가?

유병각 2022. 4. 19. 03:26

자바스크립트 함수 선언문과 함수 표현식의 차이점

선언문(statement) vs 표현식(expression)

먼저 표현식이란 어떤 변수에 할당 할 수 있는 식이다.

let a = 10; // 숫자 리터럴
let fn = function (x,y) {
    return x + y 
    };
let obj = {x : 1};

위와같이 변수에 할당 할 수 있는 모든것은 표현식이라고 볼 수 있다.

반면 선언문은 표현식과는 반대로 변수에 할당 할 수 없다.

if (x > 10) {
    count += 1;
    };

대표적인 예로 if 문은 변수에 할당 할 수 없으므로 선언문이라고 할 수 있다.

함수 선언문과 함수 표현식

//함수 선언문
function add(x,y) {
    return x + y;
    }

// 함수 표현식
// case1)
const add = function (x,y) {
    return x + y;
    };

// case2)
const add = (x,y) => x+y

함수 선언문과 표현식은 위와같은 차이점이 있다.

눈썰미가 좋은 사람이면 눈치챘을것이다.
자바스크립트에서 함수 선언문을 변수에 할당 할 수 있는데 그럼 선언문이 아니라 표현식이 아닌가요? 라고.

// 예를들어
const fn = function add (x,y) {
    return x + y;
    };

이 경우에는 함수 선언문을 표현식처럼 사용할 수 있다. 이게 어떻게 된 일인가?

이건 자바스크립트 엔진에서 변수에 함수 선언문을 할당할 때, 함수 선언문을 함수 리터럴로 해석해서 발생하는 문제이다.
어쨋거나, 함수 선언문과 함수 표현식은 약간의 차이점이 있다.

함수 선언문과 함수 표현식의 기능상의 차이

stateFn(); // 10
expressFn(); // reference error.
function stateFn () {
    return 10;
    }
const expressFn = function () {
    return 15;
    }

함수 선언문은 호이스팅될때 초기값을 함수값으로 할당된다.
하지만, 함수 표현식은 호이스팅될때 함수값에 변수와같이 undefined 가 할당이 된다.

따라서 함수 표현식은 함수가 정의되기 전에는 사용 할 수 없다.