상세 컨텐츠

본문 제목

[JavaScript] 함수와 프로토타입 체이닝(2)

개발공부/JavaScript

by 임우찬 2019. 9. 11. 10:44

본문

 

7. 함수 호출

7-(1) arguments 객체

- 자바스크립트 언어 자체가 C/C++과 같은 엄격한 문법체크를 안한다.

(함수 호출이 다른 언어와 달리 자유롭다)

예시)

출력결과:

func(); -> undefined, undefined

func(1); -> 1, undefined

func(1,2,3); -> 1,2

- 위 예시와 같이 인자를 어떻게 넘겨도 호출시 에러가 나지 않는다.

- 이러한 특성 때문에 호출된 인자의 개수를 확인하고 이에 따라 동작을 다르게 해줘야 할 경우가 있는데, 이를 가능케 하는 것이 "arguments" 객체이다.

- 따라서, 자바스크립트에서는 함수 호출 시 인수들과 암묵적으로 arguments 객체가 함수 내부로 전달된다.

- 결론적으로, arguments 객체는 함수를 호출할 때 넘긴 인자들이 배열 형태로 저장된 객체를 의미한다.

(여기서 특이점은 이 배열형태로 저장된 객체는 실제 배열이 아닌 "유사 배열 객체" 라는 것이다.)

* argument 는 "객체"다. 절대로 일반 배열이 아니다.

7-(2) arguments 객체 구성(_proto_ 제외)

- 세 가지로 구성된다.

- 1. 함수를 호출할 때 넘겨진 인자(배열형태) : 호출시 첫 인자는 0번 인덱스, 두 번째는 1번 인덱스...

- 2. length 프로퍼티 : 호출할 때 넘겨진 인자의 개수를 의미한다.

- 3. callee 프로퍼티 : 현재 실행 중인 함수의 참조값을 의미한다.

7-(3) arguments 객체의 사용

- arguments 객체는 매개변수 개수가 정확하게 정해지지 않은 함수를 구현하거나, 전달된 인자의 개수에 따라 서로 다른 처리를 해야하는 함수 개발에 유용하다.

- arguments 객체를 사용할 경우 함수 호출 당시 인자들에 배열 형태로 접근 가능하다.

( '[]'배열 리터럴 사용하여. )


8. 호출 패턴과 this 바인딩

- 함수 호출 시 기존 매개변수로 전달되는 인자값에 더해 "arguments"객체 및 this 인자가 함수 내부로 전달된다.

- this 는 함수가 호출되는 방식에 따라 다른 객체를 참조한다.

이 호출방식은 크게 4가지로 이루어져 있다.

(호출 방식에 따라 달라지는 this 바인딩)

- 여기서 설명 전에, 호출 방식에 따라 달라진다는 말을 이해해보자.

쉽게 국어로 설명해서 "나"라는 단어라고 이해하자.

내가 말할때 "나는 배고프다." 이 문장에서 "나"는 진짜 나를 가리키는 것이다.

하지만 아버지께서 "나는 배고프다." 라고 말할 경우, 이 문장에서 "나"는 아버지를 가리키는 단어가 된다.

이런 것 처럼 this가 호출 방식에 따라 달라진다는 말을 상황에 따라 달라지는 일종의 대명사 정도라고 생각하자.

(여기서 this는 거의 대부분의 상황에서 '객체'를 의미한다.)

8-(1) 객체의 메서드 호출 사용 시 this 바인딩.

- 메서드란? 객체의 프로퍼티가 함수일 경우를 메서드라고 한다.

- 이러한 메서드 호출 시 메서드 내부 코드에서 사용된 this 는 해당 메서드를 호출한 객체로 바인딩된다.

8-(2) 함수 호출 시 this 바인딩

- 결론부터 말하자면, 함수 내부 코드에서 사용한 this는 전역 객체에 바인딩된다.

- 브라우저에서 자바스크립트 실행 시 전역객체는 window 객체가 된다.

(Node.js였다면 전역객체는 window객체가 아닌 global 객체가 되었을 것이다.)

- 이는 내부함수 호출 시에도 그대로 적용된다.(window)

- 객체의 메서드 호출 후 그 메서드 안의 내부함수에서 this 를 사용하는 경우가 있다.

이럴 경우, 자바스크립트에서 내부함수 호출 패턴을 따로 정의해놓지 않았다.

다시말해, 내부함수도 결국 함수이므로, 이를 호출할 때는 함수호출로 취급한다는 뜻이다.

(전역객체 window에 바인딩된다는 뜻이다.)

말로는 이해하기 힘들테니 코드로 확인해보자.

예시)

위 코드의 실행 결과는 어떻게 될까?

결과는 다음과 같다.

2

101

102

- 이 결과가 나온 이유는 첫 콘솔은 메서드 호출 사용 시의 this 바인딩이라고 해석했기 때문이고,

두 번째와 세 번째는 메서드가 아닌 그냥 일반 함수 안의 this 바인딩이라고 해석했기 때문이다.

- 그렇다면 이 문제는 어떻게 해결할 수 있을까?

- 이러한 문제는 부모함수의 this를 내부함수가 접근 가능한 다른 변수에 저장하는 것으로 해결할 수 있다.

관례상 this 값을 저장하는 변수 이름을 that이라고 짓는데, 내부함수에서는 that 변수로 부모 함수의 this를 가리키는 객체에 접근 가능하다.

- 위와 같은 방법을 사용했을 경우에는 결과가 다음과 같다.

2

3

4

- 이렇게 부모함수의 this를 내부함수가 접근 가능한 다른 변수에 저장함으로 문제를 해결할 수 있다.

- 꼭 이 방법이 아니더라도, 이와같은 this 바인딩의 한계 극복을 위해 this 바인딩을 명시적으로 할 수 있도록

call, apply 메서드를 제공하고있다.

- JQuery, underscore.js 등과 같은 자바스크립트 라이브러리들은 bind라는 메서드를 통해,

사용자가 원하는 객체를 this 에 바인딩하는 기능을 제공한다.


관련글 더보기

댓글 영역