Arguments
arguments 개념
- 함수는 arguments라는 지역 변수를 가지고 있으며, 이를 통해서 함수를 호출할때 입력되는 인수를 볼 수 있다.
- 함수안에서 볼수 있고 이름과 특성은 정해져 있다.
- 이름 : arguments
- 특성 : 유사 배열 형태의 객체. 배열은 아니지만 배열의
.length
속성은 사용할 수 있다.
- 자바스크립트는 함수의 매개변수와 인수의 개수가 일치하는지 확인하지 않으며, 모든 인수는 암묵적으로 arguments 객체의 프로퍼티로 저장된다.
사용
예시 1
function sum(a, b) {
console.log(arguments);
return a + b;
}
console.log(sum()); // NaN
console.log(sum(1)); // NaN
console.log(sum(1, 2)); // 3
console.log(sum(1, 2, 3)); // 3
-
위 예시의 함수 속 콘솔은 아래와 같이 나온다.
console.log(sum()); // NaN
-
인수가 전달되지 않는 매개변수는 undifined로 초기화된 상태를 유지한다. length는 0으로나오고 프로퍼티는 없기때문에 나오지 않는것을 볼 수 있다.
{ length: 0, callee: ƒ sum(), __proto__: { ... } }
-
console.log(sum(1)); // NaN
-
인수가 전달되지 않는 매개변수는 undifined로 초기화된 상태를 유지한다. 전달된 인수가 하나이기 때문에 length는 1로, 프로퍼티 또한 전달받은 하나의 인자가 0으로 인덱싱되어서 나온다.
{ '0': 1, length: 1, callee: ƒ sum(), __proto__: { ... } }
-
console.log(sum(1, 2)); // 3
-
인수가 모두 전달되었기 때문에 undefined로 초기화된 매개변수가 없이 전달받은 인수들이 모두 나오고, 함수는 계산된 값을 출력해준다.
{ '0': 1, '1': 2, length: 2, callee: ƒ sum(), __proto__: { ... } }
-
console.log(sum(1, 2, 3)); // 3
- 매개변수의 개수보다 더 많은 인수가 전달되었다. 이 경우에는 초과된 인수를 무시한 후 결과값을 출력하게 된다.
-
하지만 초과된 인수는 버려지지 않고 arguments 객체의 프로퍼티로 보관되어있는 것을 볼 수 있다.
{ '0': 1, '1': 2, '2': 3, length: 3, callee: ƒ sum(), __proto__: { ... } }
예시 2 (권장하지 않는 방식이라고 함)
function.arguments
function pat(n) { mat(n - 1); } // 순서 : 2-1, 5-1 function mat(n) { // 순서 : 2-2, 5-2 console.log('before: ' + mat.arguments[0]); // 순서 : 3, 6 if (n > 0) { pat(n); } // 순서 : 4 console.log('after: ' + mat.arguments[0]); // 순서 : 7, 8(?) } pat(2); // 순서 1 console.log('returned: ' + mat.arguments); // 9
- 위 코드의 순서
- pat에 인수 2를 대입 하여 pat함수 호출
- pat함수의 매개변수는 mat에 (n-1)이라는 인수로 전달되며 mat(1)로 함수 호출
- mat함수 첫번재 줄
before : 1
출력 - 두번째 줄 if 조건 만족하여 pat에 인수 1이 전달되며 pat함수 호출
- 2번과 똑같이 pat함수의 매개변수는 mat에 (n-1)이라는 인수로 전달되며 mat(0)로 함수 호출
- 3번과 똑같이 mat함수 첫번째 줄
before : 0
출력 - 두번째 줄 if 조건에 부합하지 않음으로 패스하고 세번째 줄
after : 0
출력 - 4번에서 mat 함수 속의 if에 걸려서 pat이 호출됨으로 인해 함수 mat(1)이 끝나지 않고 대기하고 있다가 mat(0)이
after : 0
을 출력하며 끝이나자 이어서after : 1
을 출력 console.log('returned: ' + g.arguments);
의 g.arguments는 mat함수 밖이라서return: null
값으로 출력
- 사진에서는 pat 함수에
console.log(pat.arguments[0])
을 추가했다. - 처음 전달해준 pat의 인수는 2인데 console에는 1이 먼저 출력되고 2가 출력된다.
- 그 이유가 뭔지 생각해보자! (참고: call stack)
- 위 코드의 순서