[Inside Javascript] 7. 함수 생성

2022. 6. 30. 16:35·독서/Inside Javascript
반응형

자바스크립트의 함수는 다른 언어의 함수와 마찬가지로 코드의 묶음으로도 역할을 하지만,

모듈화 / 클로저 / 객체 생성 등의 역할을 하기도 한다.

 

자바스크립트에서 함수를 생성하는 방법은 3가지가 있다.

 

1. 함수 선언문

함수 리터럴 형태로 함수를 선언한다.

function func(a, b) {
	return a + b;
}

// use function
var result = func(1,2); // result = 3

function 키워드, 함수 이름, 매개변수와 함수 몸체로 구성된다.

함수 이름은 원래 생략하여 익명함수로도 리터럴 함수를 생성할 수 있지만,

함수 선언문 방식으로 함수를 선언할 때는 함수 이름을 반드시 입력해야한다.

 

( 보통 익명함수는 콜백함수를 인자로 넘길 때 많이 사용한다. )

// 함수 리터럴로 생성한 익명 함수를 콜백함수로 넘긴다.
...
element.addEventListener("click", function () {
	callback function
});

2. 함수 표현식

표현식, 말 그대로 변수를 선언하듯 var f = function 형태로 함수를 생성한다.

자바스크립트에서는 함수도 하나의 값으로 취급되기 때문에 변수에 할당이 가능하며,

이렇게 변수에 할당하여 함수를 생성하는 방식이 함수 표현식이다.

var func = function (a, b) {
	return a + b;
}

var result = func(1,2) // result = 3

변수에 익명 함수 리터럴을 담아두고, 해당 변수와 () 연산자를 이용해 함수를 호출하는 방식이다.

각각의 변수는 함수 리터럴을 가리키고 있을 뿐이므로, 변수에 계속 할당을 반복해도 같은 함수를 참조한다.

var f = function () {
	console.log("test");
}

var a = f;
var b = f;

// 아래 3개는 모두 같은 함수를 호출한 것이다.
f();
a();
b();

물론 익명함수가 아닌 함수 리터럴을 변수에 담을 수도 있다. 이런 경우를 '기명 함수 표현식' 이라고 한다.

이 경우, 함수 리터럴에서 사용된 이름은 외부에서 접근할 수 없으므로 오류가 발생한다.

 

var f = function func() {
	console.log("test");
}

f(); // print 'test'
func(); // func is not defined error is occured

함수 리터럴에서 사용도니 이름이 외부에서 접근할 수 없다면,

함수 선언문 방식으로 선언된 함수를 외부에서 사용할 수 있는 이유가 무엇일까?

 

그 이유으는 함수 선언문 방식으로 함수를 선언하고 코드를 실행하면,

자바스크립트 엔진에 의해 함수 표현식으로 코드가 바뀌기 때문이다.

function add(a,b) {
	return a + b;
}

/// it will be changed like following code.

var add = function add(a,b) {
	return a + b;
}

즉 add  함수를 add 변수에 담아서 사용하게 된 것이다.

 

함수 리터럴에서 사용된 함수이름은 함수 내부에서는 접근할 수 있다. (재귀 호출에 사용 가능)

var funcVar = function func(n) {
	if (n == 1) return 1;
    return n*func(n-1);
    // return n*funcVar(n-1) 도 가능하다
}

3. Function() 생성자 함수를 이용한 생성

자바스크립트의 함수도 하나의 객체로서 Function 생성자 함수를 이용해 생성된 객체이다.

앞서 적은 2가지 방식도 모두 내부적으로는 Function 생성자 함수를 사용한다.

하지만 이 방식은 자주 사용하지 않는다.

생성 방법은 다음과 같다.

var func = new Function(arg1, arg2, arg3, 'console.log(arg1); return;');
// 마지막 인자는 함수 몸체에 들어갈 코드 문자열이고, 그 앞까지는 모두 함수 매개변수이다.

지금까지 함수 생성 방법 3가지를 알아보았다.

마지막 방법은 자주 사용하는 방법도 아닐 뿐더러 함수 몸체를 문자열로 선언하는 것은 코드를 작성하는데 큰 불편함이 있으므로 사용하기 쉽지 않다.

 

결국 함수 선언문과 함수 표현식으로 함수를 생성하게 될 텐데, 이 두가지 방식에는 '함수 호이스팅' 이라는 큰 차이가 존재한다.

함수 호이스팅은 아래에서 선언된 함수가 위에서 선언된 것처럼 코드가 자동으로 옮겨져,

코드 순서상으로는 함수를 선언하기 전에 함수를 호출해도 호출이 가능한 현상이다.

 

이 함수 호이스팅 현상은 '함수 선언문' 방식에서만 발생한다.

그래서 디버깅의 용이를 위해 '함수 표현식' 만을 함수 선언에 사용하도록 권장하기도 한다.

함수 표현식으로 함수를 선언할 경우, 함수를 선언 하기 전에 함수를 호출하면 에러가 발생한다.

반응형
저작자표시 비영리 변경금지 (새창열림)

'독서 > Inside Javascript' 카테고리의 다른 글

[Inside Javascript] 6. 기본타입과 표준메서드, 연산자  (0) 2022.06.12
[Inside Javascript] 5. 배열  (2) 2022.05.09
[Inside Javascript] 4. 프로토타입 개념  (0) 2022.04.06
[Inside Javascript] 3. 자바스크립트의 객체  (0) 2022.03.26
[Inside Javascript] 2. 자바스크립트의 데이터타입  (0) 2022.03.25
'독서/Inside Javascript' 카테고리의 다른 글
  • [Inside Javascript] 6. 기본타입과 표준메서드, 연산자
  • [Inside Javascript] 5. 배열
  • [Inside Javascript] 4. 프로토타입 개념
  • [Inside Javascript] 3. 자바스크립트의 객체
에버듀
에버듀
개발은 좋은데 뭘로 개발할까
  • 에버듀
    Blog. 에버듀
    에버듀
  • 전체
    오늘
    어제
    • 분류 전체보기 (615)
      • 개인 프로젝트 (43)
        • 토이 프로젝트 (3)
        • [2020] 카카오톡 봇 (9)
        • [2021] 코드악보 공유APP (22)
        • [2022] 유튜브 뮤직 클론코딩 (9)
        • [2025] 한글 SQL 데이터베이스 (0)
      • 팀 프로젝트 (22)
        • [2020] 인공지능 숫자야구 (4)
        • [2022] OSAM 온라인 해커톤 (10)
        • [2024] GDSC 프로젝트 트랙 (6)
        • [2025] 큰소리 웹 페이지 (2)
      • CS (335)
        • 자료구조 (19)
        • 어셈블리 (41)
        • 멀티미디어응용수학 (7)
        • 컴퓨터 구조 (29)
        • 알고리즘 분석 (4)
        • 컴퓨터 네트워크 (38)
        • 프로그래밍언어론 (15)
        • HCI 윈도우즈프로그래밍 (26)
        • 기초데이터베이스 (29)
        • 운영체제 (23)
        • 오토마타 (24)
        • 문제해결기법 (11)
        • 블록체인 (22)
        • 소프트웨어공학 (21)
        • 기계학습심화 (12)
        • 컴퓨터그래픽스와 메타버스 (8)
        • 분산시스템특론 (6)
      • 자기계발 (45)
        • 생각 정리 (23)
        • 대외활동 (11)
        • 동아리 (7)
        • 자격증 (3)
        • 머니 스터디 (1)
      • 알고리즘 (PS) (107)
        • BOJ (101)
        • Programmers (5)
        • 알고리즘 이모저모 (1)
      • WEB(BE) (8)
        • express.js (1)
        • Spring & Spring Boot (7)
      • WEB(FE) (2)
        • html, css, js (1)
        • React.js (1)
      • Tool & Language (6)
        • Edit Plus (1)
        • Git (1)
        • Python3 (2)
        • Java (2)
      • Infra (12)
        • AWS (1)
        • Oracle Cloud (8)
        • Firebase (2)
        • Network (1)
      • Android (18)
        • Java (6)
        • Flutter (12)
      • Window (2)
        • Visual Studio 없이 WPF (1)
        • MFC (1)
      • 독서 (14)
        • Inside Javascript (7)
        • Database Internals (6)
        • 한 글 후기 (1)
  • 링크

    • github
    • website
  • 인기 글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
에버듀
[Inside Javascript] 7. 함수 생성
상단으로

티스토리툴바