해당 글은 모던 자바스크립트 딥다이브 함수 파트를 읽고 개인적인 의견과 합쳐서 정리한 글입니다.
함수란?
자바스크립트에서 가장 중요한 핵심 개념입니다.
자바스크립트의 핵심 개념들인 스코프, 실행 컨텍스트, 클로저, 생성자 함수에 의한 객체 생성, 메서드, this, 프로토타입, 모듈화 등이 모두 함수와 관련이 있습니다.
수학의 함수는 입력(input
)과 출력(output
)을 내보내는 일련의 과정을 의미합니다.
함수를 사용하는 이유?
- 같은 코드를 여러 번 작성하는 것이 아니라 한번만 작성하고 호출할 수 있습니다. (코드의 재사용성, 편의성)
- 코드의 중복을 억제하고 재사용성을 높이면 실수를 줄일 수 있습니다. (코드의 신뢰성)
- 함수 이름을 잘 지으면 내부 코드를 이해하지 않아도 코드를 이해할 수 있습니다. (코드의 가독성)
함수 리터럴
리터럴: 사람이 이해할 수 있는 문자 또는 약속된 기호를 사용해 값을 생성하는 표기 방법
1var f = function add(x, y) { 2 return x + y; 3};
함수 리터럴의 구성 요소로는 함수 이름, 매개변수 목록, 함수 몸체로 되어있습니다.
함수 이름은 식별자이기 때문에 식별자 네이밍 규칙을 준수해야 합니다. 함수 이름은 생략 가능합니다. (무명, 익명 함수)
매개변수는 0개 이상이고, 쉼표로 구분합니다. 매개변수에는 순서에 의미가 있습니다. 그래서 지정한 순서대로 읽을 수 있습니다.
함수 몸체는 함수 호출에 의해 실행됩니다.
자바스크립트에서 함수는 객체 타입의 값입니다. 그래서 함수도 함수 리터럴로 생성할 수 있습니다. 그래서 함수를 변수에 할당하는 것 또한 가능합니다.
함수는 객체지만 일반 객체와는 좀 다릅니다.
- 함수는 호출 가능, 일반 객체 는 호출 불가능
- 함수는 일반 객체에 없는 고유한 프로퍼티를 가지고 있음
함수 정의
함수를 정의하는 방법에는 크게 4가지 방법이 있습니다.
- 함수 선언문
- 함수 표현식
- Function 생성자 함수
- 화살표 함수 (ES6)
하나씩 살펴보고 각각의 차이점들을 살펴보겠습니다.
함수 선언문
함수 선언문은 다음과 같이 생겼습니다.
1function add(x, y) { 2 return x + y; 3}
함수 선언문의 함수 이름은 생략 불가능 합니다.
1function (x, y) { 2 return x + y; 3} 4// SyntaxError: Function statements require a function name
자바스크립트 엔진은 함수 선언문을 해석해서 함수 객체를 생성합니다. 이 때 함수 이름은 함수 몸체 내부에서만 유효한 식별자라서 외부에서 함수 이름에 대한 참조가 불가능합니다. 근데 가능한 이유는 자바스크립트 엔진이 암묵적으로 함수 이름과 동일한 이름의 식별자를 생성하고, 거기에 함수 객체를 할당하기 때문입니다.
1var add = function add(x, y) { 2 return x + y; 3}; 4 5console.log(add(2, 5)); // 7
자바스크립트 엔진이 암묵적으로 식별자를 생성했다고 생각하고 코드를 짜보면 위와 같습니다.
그래서 함수 선언문은 함수 이름인 add