본문 바로가기
컴퓨터/Frontend

[Javascript] 함수 표현식

by stdFrog 2023. 3. 15.

함수를 호출하는 포인터 변수를 함수 포인터라고 부른다.
보통 C언어에서 이렇게 부르는데 JavaScript에서도 이 함수 포인터와 같은 동작을 볼 수 있다.

다만, 포인터 타입이 존재하지 않으므로 함수 포인터가 아닌 함수 표현식이라고 부른다.
Javascript에서 함수 표현식은 C언어의 함수 포인터와 유사한데 사용하기는 훨씬 편리하다.

let hello = function(){
	return console.log("hello world");
}
hello();


인수의 타입이나 리턴 타입을 신경쓸 필요가 없고 출력 방향이 고정되어 있으므로 조금 더 자유롭다.
아마 위와 같은 구문을 현 버전의 C언어로 작성하면 다음과 같을 것이다.

#include <stdio.h>

char* hello(void){
        return (char*)"hello World";
}

int main()
{
        char* (*pf)(void) = hello;
        char* szHello = pf();
        printf("%s", szHello);
}

문자열 상수를 리턴하는 함수가 조금 어색해 보일 수 있다.
C에서의 문자열 상수는 항상 모듈에 포함되는 정적 데이터로 구분된다.

즉, 문자열의 시작 번지를 가리키는 문자형 포인터 상수로 평가되므로 위 구문 역시 합법이며
이 값은 실행 파일의 정적 데이터 영역에 저장된다.

JavaScript에 비해 조금 길어지긴 했지만 이해하지 못할 정도는 아니다.

사실 함수 포인터는 잘 사용되지 않는데다가 위와 같은 상황에선 더더욱 사용할 필요가 없다.
굳이 함수 포인터를 응용하는 예시를 만들어보자면 이런 상황을 들 수 있다.

#include <stdio.h>

int f1(int a, int b){
        return 1;
}

int f2(int a, int b){
        return 2;
}

int (*ChoiceFunc(char c))(int a, int b){
        if(c == 1){
                return f1;
        }else{
                return f2;
        }
}

int main()
{
        int (*fp)(int, int);

        fp = ChoiceFunc(1);
        printf("%d", fp(1,2));
}

"오버로딩을 할 수 없는 상황에서 계산 방법이 달라야 한다"라는 가정을 한건데
흔한 상황은 아니지만 굳이 사용하자면 위와 같은 상황에서 사용될 순 있다.

자바 스크립트에선 어떤 상황에서 함수 표현식을 사용하게 되는지 조금 더 연구해봐야 될 것 같다.

반응형

'컴퓨터 > Frontend' 카테고리의 다른 글

[Javascript] 객체와 프로퍼티  (0) 2023.03.15
[Javascript] 콜백함수  (0) 2023.03.15
[Javascript] 호이스팅  (0) 2023.03.15
[Javascript] 백틱과 템플릿 리터럴  (0) 2023.03.15
[Javascript] var와 let의 차이  (0) 2023.03.15

댓글