이력

  • 2022.03.03 포스팅
  • 2022.03.09 그림 추가

​모든 내용을 상세히 담으려 하지 않았습니다.
제가 모르는 부분이나, “이런 것도 있었어?” 하는 부분, 중요하다고 생각되는 부분,
다시 한번 되새기고 싶은 부분만 기록했습니다.
읽어주셔서 감사합니다.

22.1 파라미터 처리 시나리오

  • 함수호출시 전달하는 파라미터와 함수에 정의된 파라미터 수가 다르면 어떻게 처리될까요?

22.2 파라미터 값 할당

  • 호출시 전달하는 파라미터의 수와 함수 선언문/표현식에 정의된 파라미터의 수가 달라도 함수는 호출되어서 진행됩니다. 그러므로 이에 대한 대비를 해야합니다. 호출하는 파라미터의 수가 적어서 값이 전달되지 않으면 undefined가 되고, 초과하여 전달되는 파라미터의 값은 함수에서 사용되지 않습니다.

22.3 arguments 오브젝트

  • 함수 호출시에 파라미터를 arguments 오브젝트에 저장합니다. 그러므로 함수내부에서는 파라미터를 정의하지 않더라도 사용할 수 있게 되는 것입니다. 파라미터의 순서에 맞게 전달되어야 하므로 순서에 맞게 값을 저장합니다. js의 기본적인 저장 형태인 {name: value} 형태로 저장되며 name이 0부터 시작하여 파라미터의 개수에 맞게 증가하여 저장됩니다.
  • 아규먼트 오브젝트는 arguments 로 접근할 수 있습니다.
  • arguments에 접근하여 순회하는 경우 오브젝트로 저장되어 있기 때문에 for-in을 사용해 순회하면 0번 파라미터부터 순차적으로 접근을 보장하는 않는다는 것을 유의해야 합니다. 순차적으로 접근하고 싶은경우 length 프로퍼티를 보고 인덱스를 증가시키며 배열처럼 접근하면 됩니다.

22.4 arguments 오브젝트 사용 장단점

22.5 length 프로퍼티

  • arguments 오브젝트의 length 프로퍼티는 호출한 함수에서 넘겨준 파라미터의 수를 나타냅니다.

22.6 arguments 오브젝트 구조

  • callee는 현재 실행중인 함수를 나타냅니다. 함수의 이름이 있는 경우(함수 선언문) 이름으로 함수를 호출할 수 있기 때문에 필요없으나, 이름이 없는 함수 표현식의 경우 callee를 통해 재귀호출을 수행할 수 있습니다. fig.1

22.7 arguments 값 반환

22.8 자바스크립트 엔진 처리

  • 아래의 함수가 자바스크립트 엔진에서 어떻게 처리되는지 알아봅시다. 엔진의 처리 과정은 함수 호출 -> 파라미터 값 할당 -> arguments 오브젝트 생성 -> 함수 코드 실행순입니다.
1
2
3
4
function get(one) {
  return one + 1;
}
get(100, 77);
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
함수 호출
1. get 함수를 호출한다.
 - get(100, 77)

파라미터 값 할당
2. 호출된 함수의 파라미터 이름 수만큼 반복합니다.
 - 호출된 함수의 파라미터 이름 수가 기준입니다.
3. 호출된 함수의 두 번째 파라미터에 이름이 없으므로 77은 할당하지 못합니다.
4. 호출된 함수에 파라미터 이름이 있으면서 넘겨받은 값이 없으면 undefined를 할당합니다.

arguments 오브젝트 생성
5. arguments 오브젝트를 생성합니다.
6. 넘겨받은 파라미터 수를 arguments 오브젝트의 length 프로퍼티에 설정합니다.
7. 파라미터로 받은 값을 저장하기 위한 임시 오브젝트를 생성합니다.
8. 인데스 초기값을 0으로 설정합니다.
9. 넘겨받은 파라미터 수만큰 반복합니다.
 - 호출할때 넘겨준 파라미터의 수 만큼 반복하므로, 호출받는 함수에 정의된 파라미터의 수가 작더라도 arguments 오브젝트에는 할당되는 것 입니다.
10. 임시 오브젝트는 {0, 100}, {1: 77} 이 됩니다.
11. arguments 오브젝트에 임시 오브젝트를 설정합니다.

함수 코드 실행
12. 함수의 첫 번째 코드부터 실행합니다. 

22.9 자바스크립트와 오버로딩

  • 자바스크립트는 오버로딩이 성립하지 않습니다.
  • 함수 이름이 같으면 아래에 작성한 함수가 호출됩니다. 또한 strict 모드에서는 에러가 발생합니다.
  • 파라미터의 수가 달라도 호출되므로 파라미터 수에 따른 오버로딩도 안됩니다.
  • 22.8장을 통해 알수 있듯이 arguments 오브젝트 처리시에 데이터 타입을 따지지 않기 때문에 타입을 통한 오버로딩도 안됩니다.