12장 함수
12.1 함수란?
프로그래밍 언어의 함수는 일련의 과정을 문(statement)으로 구현하고 코드 블록으로 감싸서 하나의 실행 단위로 정의한 것이다.
매개변수(parameter) : 함수 내부로 입력을 전달받는 변수
인수(argument) : 입력
반환값(return value) : 출력
- 함수는 객체 타입의 값이며, 구분을 위해 식별자인 함수 이름을 사용한다.
- 함수는 함수 정의(function definition)를 통해 생성한다.
- 함수 호출(function call/ invoke) : 인수를 매개변수를 통해 함수에 전달하면서 함수의 실행을 명시적으로 지시하는 것
// 함수 정의
function add(x, y) { // 함수이름(매개변수1, 매개변수2)
return x + y; // return 반환값;
}
// 함수 호출
add(2, 5); // 함수이름(인수1, 인수2)
12.2 함수를 사용하는 이유
- 함수는 몇 번이든 호출할 수 있으므로 코드의 재사용이라는 측면에서 매우 유용하다.
- 코드의 중복을 억제하고 재사용성을 높이는 함수는 유지보수의 편의성을 높이고 실수를 줄여 코드의 신뢰성을 높이는 효과가 있다.
12.3 함수 리터럴
- 함수는 함수 리터럴로 생성할 수 있다.
- 함수 리터럴은 function 키워드, 함수 이름, 매개변수 목록, 함수 몸체로 구성된다.
- 함수 리터럴은 평가되어 값을 생성하며, 이 값은 객체다. 즉, 함수는 객체다.
- 일반 객체는 호출할 수 없지만 함수는 호출할 수 있다.
// 변수에 함수 리터럴을 할당
var f = function add(x, y) {
return x + y;
};
12.4 함수 정의
: 함수를 호출하기 이전에 인수를 전달받을 매개변수와 실행할 문들, 그리고 반환할 값을 지정하는 것
함수를 정의하는 방법 4가지
1. 함수 선언문
function add(x,y) {
return x + y;
}
2. 함수 표현식
var add = function (x,y) {
return x + y;
};
3. Function 생성자 함수
var add = new Function('x','y','return x+y');
4. 화살표 함수(ES6)
var add = (x,y) => x + y;
1. 함수 선언문
function add(x,y) {
return x + y;
}
-
함수 선언문은 함수 리터럴과 형태가 동일하다.
단, 함수 리터럴은 함수 이름을 생략할 수 있으나, 함수 선언문은 함수 이름을 생략할 수 없다.
-
함수 선언문은 표현식이 아닌 문이다.
-
자바스크립트 엔진은 생성된 함수를 호출하기 위해 함수 이름과 동일한 이름의 식별자를 암묵적으로 생성하고, 거기에 함수 객체를 할당한다.
-
함수는 함수 이름으로 호출하는 것이 아니라 함수 객체를 가리키는 식별자로 호출한다.
2. 함수 표현식 (function expression)
: 함수 리터럴로 생성한 함수 객체를 변수에 할당하는 것
일급 객체 : 값의 성질을 갖는 객체
3. 함수 생성 시점과 함수 호이스팅
- 함수 선언문으로 정의한 함수와 함수 표현식으로 정의한 함수의 생성 시점이 다르다.
- 함수 선언문으로 정의한 함수는 함수 선언문 이전에 호출할 수 있다.
함수 호이스팅 (function hoisting) : 함수 선언문이 코드의 선두로 끌어 올려진 것처럼 동작하는 자바스크립트 고유의 특징
- 함수 선언문을 통해 암묵적으로 생성된 식별자는 함수 객체로 초기화된다.
- 변수 할당문의 값은 할당문이 실행되는 시점, 즉 런타임에 평가되므로 함수 표현식의 함수 리터럴도 할당문이 실행되는 시점에 평가되어 함수 객체가 된다.
4. Function 생성자 함수
생성자 함수(constructor function)
: 객체를 생성하는 함수
var add = new Function('x','y','return x+y');
- 함수 선언문이나 함수 표현식으로 생성한 함수와 Function 생성자 함수로 생성한 함수는 동일하게 동작하지 않는다.
5. 화살표 함수 (arrow function)
var add = (x,y) => x + y;
- 화살표(fat arrow) 사용
- 항상 익명 함수로 정의
- 내부 동작의 간략화
- 생성자 함수로 사용 불가능, 기존 함수와 this 바인딩 방식이 다르고, prototype 프로퍼티가 없으며 arguments 객체를 생성하지 않는다.
12.5 함수 호출
- 함수 호출 연산자(함수를 가리키는 식별자 + 한 쌍의 소괄호)로 호출
- 함수를 호출하면 현재의 실행 흐름을 중단하고 호출된 함수로 실행 흐름을 옮긴다.
1. 매개변수와 인수
- 인수가 부족해서 인수가 할당되지 않은 매개변수의 값은 undefined 다.
- 매개변수보다 인수가 더 많은 경우 초과된 인수는 무시된다.
- 모든 인수는 암묵적으로 arguments 객체의 프로퍼티로 보관된다.
2. 인수 확인
a. 자바스크립트 함수는 매개변수와 인수의 개수가 일치하는지 확인하지 않는다.
b. 자바스크립트는 동적 타입 언어다. 매개변수의 타입을 사전에 지정할 수 없다.
3. 매개변수의 최대 개수
4. 반환문