본문 바로가기

개발/javascript

함수10 - 매개변수와 인수

"함수"

 

5. 함수 호출

함수는 함수를 가리키는 식별자와 한 쌍의 소괄호인 함수 호출 연산자로 호출한다. 함수 호출 연산자 내에는 0개 이상의 인수(argument)를 쉼표로 구분해 나열한다. 함수를 호출하면 현재의 실행 흐름을 중단하고 호출된 함수로 컨트롤을 넘긴다. 이때 매개변수에 인수가 순서대로 할당되고 함수 몸체의 문들이 실행되기 시작한다.

 

5.1. 매개변수와 인수

함수의 실행을 위해 필요한 값을 함수 외부에서 함수 내부로 전달할 필요가 있는 경우, 매개변수(parameter, 인자)를 통해 인수(argument)를 전달한다. 인수는 값으로 평가될 수 있는 표현식이어야 하며 인수는 함수를 호출할 때 지정하며 개수와 타입에 제한이 없다.

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

// 함수 호출
// 인수 1과 2는 매개변수 x와 y에 순서대로 할당되고 함수 몸체의 문들이 실행된다.
var result = add(1, 2);

매개변수는 함수를 정의할 때 선언하며 함수 몸체 내부에서 변수와 동일하게 취급된다. 즉, 함수가 호출되면 함수 몸체 내에서 암묵적으로 매개변수가 생성되고 일반 변수와 마찬가지로 undefined로 초기화된 이후 인수가 순서대로 할당된다. 함수가 호출될 때마다 매개변수는 이와 가은 단계를 거친다.

매개변수와 인수

매개변수는 함수 몸체 내부에서만 참조할 수 있고 함수 몸체 외부에서는 참조할 수 없다. 즉, 매개변수의 스코프(유효 범위)는 함수 내부이다.

function add(x, y) {
	console.log(x, y); // 2 5
	return x + y;
}

add(2, 5);

// 함수 add의 매개변수 x, y는 함수 몸체 내부에서만 참조할 수 있다.
console.log(x, y);	// ReferenceError: x is not defined

 

함수는 매개변수의 개수와 인수의 개수를 체크하지 않는다. 즉, 함수를 호출할 때 매개변수의 개수만큼 인수를 전달하는 것이 일반적이지만 그렇지 않은 경우에도 에러가 발생하지 않는다. 인수가 부족하여 인수가 할당되지 않은 매개변수의 값은 undefined이다.

function add(x, y) {
	return x + y;
}

console.log(add(2));	// NaN

위 예제의 매개변수 x에는 인수 2가 전달되지만, 매개변수 y에는 전달할 인수가 없다. 따라서 매개변수 y는 undefined가 초기화된 상태 그대로이다. 따라서 함수 몸체의 문 x + y2 + undefined 와 같으므로 NaN이 반환된다.

 

인수가 매개변수보다 더 많은 경우, 초과되는 인수는 무시된다.

function add(x, y) {
	return x + y;
}

console.log(add(2, 5, 10));	// 7

 

사실 초과된 인수가 그냥 버려지는 것은 아니다. 모든 인수는 암묵적으로 arguments 객체의 프로퍼티로 보관된다.

function add(x, y) {
	console.log(arguments);
	// Arguments(3) [2, 5, 10, callee: f, Symbol(Symbol.interator): f]
    
	return x + y;
}

add(2, 5, 10);

arguments 객체는 매개변수 개수를 확정할 수 없는 가변 인자 함수를 구현할 때 유용하게 사용된다.