Parameters & Arguments / 매개변수 & 인수 차이
한참 개발하다 좀 뜬금없이 대체 누구는 매개변수라고 하고 누군 인수, 인자라고 하고.. 뭐가 맞는 걸까
차이가 있긴 한 걸까? 궁금하여 찾아보게 된 블로그를 정리하는 글
일단 결론부터
- Parameters는 함수가 정의되는 부분에서 함수가 받는 변수들을 말합니다.
- Arguments는 함수가 호출될 때 함수에 전달되는 값입니다.
자바스크립트는 함수가 호출될 때 전달하는 Arguments의 개수와 함수 정의 부분의 Parameters의 개수가 달라도 에러를 발생시키지 않습니다. 이는 Arguments와 Parameters가 서로 전혀 다른 엔터티로 취급되어야 한다는 것을 뜻합니다.
맨 위에 argsCheck 함수 정의 부분에서는 Parameters가 총 3개로 정의가 되었습니다.
그리고 argsCheck 함수를 호출할 때 그보다 적은 2개의 arguments도 보내고 그보다 많은 5개의 arguments도 보냈습니다.
자바스크립트는 아무 에러도 발생시키지 않습니다.
단지 초과하는 arguments는 무시되었으며 parameters보다 부족한 arguments는 undefined로 할당되었습니다.
문제는 자바스크립트가 이것을 에러로 처리하지 않지만, 함수 실행 부분에서 에러가 발생할 여지가 있다는 것입니다.
이와 관련된 자바스크립트의 훌륭한 기능을 살펴보겠습니다.
arguments객체
이름 때문에 헷갈릴 수 있는데 이것은 모든 함수 내부에서 접근할 수 있는 지역변수의 이름입니다.
해당 함수에 전달된 arguments에 대한 항목을 포함하는 지역변수예요.
그래서 함수내부에서 const arguments =...처럼 할당한 적이 없어도 항상 접근할 수 있습니다.
위의 이미지에서 보시듯이 함수의 Parameters가 어떻게 정의되어있든 상관없이 항상 전달받은 Arguments에
접근합니다. 모양은 유사배열객체를 하고 있어서 타입검사를 해보니 객체고 배열은 아니라고 하네요. 유사배열객체겠죠?
Rest Parameters
이 역시 이름 때문에 헷갈리는데... es6에 추가된 자바스크립트 문법을 가리키는 말입니다.
arguments객체와 달리 함수에서 전달받은 arguments들을 배열의 형태로 받아옵니다.
단 가장 마지막 Parameter로 작성해야 합니다. 안 그러면 에러가 나와요.
혹은 마지막에 작성했다고 하더라도
명시적으로 입력한 Parameter를 입력해주지 않으면 여전히 Undefined가 할당되네요.
명시적으로 입력한 parameter들은 default값이 명확하거나, 그렇지 않은 경우 throw new Error를 사용해서 에러처리를
해줘야 안정적인 함수를 만들 수 있겠습니다.
Arguments 객체와 Rest Parameters의 차이
Rest Parameters는 배열이기 때문에 다양한 배열 메서드를 사용할 수 있습니다.
Arguments가 length 같은 것을 가지고 있다고 하더라도 이것은 배열의 모습을 흉내 낸
유사배열객체이기 때문에 메서드 사용이 불가합니다.
Rest Parameters는 명시적으로 받고 있는 parameter가 아닌 arguments들만으로 배열을 만듭니다.
즉, 명시적으로 선언되어 받고있는 parameters들은 Rest parameters에 포함되지 않습니다(이름 잘 지었네요)
반면 arguments객체는 명시적으로 받아주는 parameters를 포함해서 함수 호출 시에 전달한 모든 arguments를 포함합니다.
꼭 이것이 필요한 경우에는 Array.from(arguments)를 사용해서 배열메서드를 적용할 수도 있겠네요.
출처: https://codeburst.io/parameters-arguments-in-javascript-eb1d8bd0ef04
Parameters & Arguments in JavaScript
Is a parameter and an argument one and the same?
codeburst.io