함수 호출
함수 호출 연산자 내에는 0개 이상의 인수를 쉼표로 구분해서 나열하고,
함수 호출 시 실행 흐름을 중단하고 호출된 함수로 제어권이 넘어간다.
이때 매개변수에 인수가 순서대로 할당되고 함수 몸체의 문들이 실행되기 시작한다.
매개변수, 인수
인수는 실제 함수에 넘어가는 값이며, 전달되어 매개변수에 할당된다.
매개변수는 함수를 정의할 때 선언하며, 함수 몸체 내부에서 변수와 동일하게 취급된다.
매개변수는 함수 몸체 내부에서만 참조할 수 있고, 함수 몸체 외부에서는 참조 불가능하다.
즉 매개변수의 스코프는 함수 내부라는 것이다.
함수는 매개변수의 개수와 인수의 개수가 일치하지 않는지 체크하지 않는다.
만약 인수가 부족해서 인수가 할당되지 않는다면 해당 매개변수는 undefined 값을 가진다.
매개변수보다 인수가 더 많다면 초과된 인수는 그냥 무시된다.
그냥 버려지는 것은 아니고, 모든 인수는 암묵적으로 arguments 객체의 프로퍼티로 보관된다.
arguments 객체는 함수를 정의할 때 매개변수 개수를 확정할 수 없는 가변 인자 함수를 구현할 때 유용하게 쓰인다.
인수 확인
- 자바스크립트 함수는 매개변수와 인수의 개수가 일치하는지 확인하지 않는다.
- 자바스크립트는 동적 타입 언어라 매개변수의 타입을 사전에 지정할 수 없다.
따라서 적절한 인수가 전달되었는지 함수 내부에서 확인할 필요가 있다.
사실 이러한 경우에도 부적절한 호출을 사전에 방지할 수 없어 런타임 에러가 발생할 가능성이 있다.
그래서 현재 회사에서는 타입스크립트를 사용중이다.
개발하면서 컴파일 시 에러를 잡을 수있다는 것은 소프트웨어의 안정성을 높일 수 있음을 다시 한 번 느낀다.
인수가 전달되지 않았다면 단축 평가를 이용해 기본 값을 할당할 수도 있다.
ES6 에서는 아래와 같이 매개변수 기본값을 지정할 수도 있는데,
해당 기능은 매개변수에 인수를 전달하지 않았을 때와 undefined 를 전달한 경우에만 유효하다.
function add(a=0, b=0, c=0) {
return a + b + c;
}
console.log(add(1)); // 1
매개변수 최대 개수
ECMAScript 사양은 매개변수의 최대 개수에 대해 제한하고 있지는 않다.
그렇지만 이상적인 매개변수 개수는 0개이며 적을수록 좋다.
매개변수가 많다는 것은ㅇ 함수가 여러 가지 일을 한다는 증거라 바람직하지 않다.
권장은 3개 이상을 넘지 않는 것이다.
이 이상의 매개변수가 필요하다면 하나의 매개변수를 선언하고 객체를 인수로 전달하는 것이 유리하다.
객체를 인수로 사용하는 경우 프로퍼티 키만 정확히 지정하면 매개변수의 순서를 신경쓰지 않아도 된다.
하지만 주의해야할 점은 함수 외부에서 함수 내부로 전달한 객체를 내부에서 변경하게 되면,
외부의 객체가 변경되는 사이드 이펙트가 발생한다는 것이다.
복잡한 코드에서 의도치 않은 객체의 변경을 추적하는 것은 어려운 일이기에
변경을 추적하려면 Observer 패턴 등을 이용해 객체를 참조 공유 하는 모든 것들에게
변경되었다는 사실을 통지해야한다.
또한 이 문제를 해결하려면
사실 이것도 이전 포스팅에서 다뤘던 객체의 복사와 연결되는 개념이다.
'Archive > Develop' 카테고리의 다른 글
[ TypeORM ]Active Record vs Data Mapper (0) | 2022.09.19 |
---|---|
[ 모던 자바스크립트 스터디 ] 스코프(Scope) (0) | 2022.09.18 |
[ 모던 자바스크립트 스터디 ] 함수 선언/ 함수 표현/ Function/ 화살표 함수 (0) | 2022.09.18 |
[ 모던 자바스크립트 스터디 ] 원시 값과 객체 비교 (0) | 2022.09.18 |
[ 모던 자바스크립트 스터디 ] 객체 (0) | 2022.09.17 |