IT_Programming/JavaScript

자바스크립트 완벽가이드 - 8.4 메서드로서의 함수

JJun ™ 2010. 7. 4. 22:18


메서드는 객체 프로퍼티에 저장되어 객체를 통해 호출할 수 있는 자바스크립트 함수에 지나지 않는다.

함수는 데이터 값이며 함수가 정의되어 저장된 이름에는 특별한 것이 없다는 사실을 상기하라.

함수는 어떠한 변수나 객체의 프로퍼티에도 저장될 수 있다.

 

만약 함수 f와 객체 o가 있다면 메서드 m을 다음과 같은 방법으로 정의할 수 있다.

o.m = f;


객체 o의 정의된 메서드 m()은 다음과 같이 호출할 수 있다.

o.m()


만약 메서드 m()이 두 개의 전달인자를 필요로 하면 다음과 같이 호출할 수 있다.

o.m(x, x+2);


메서드에는 중요한 프로퍼티가 하나 있다. 호출된 메서드가 속하여 있는 객체는 메서드 몸체 안에 this라는

키워드의 값으로 저장된다. 따라서 o.m() 메서드를 호출할 때 메서드의 몸체 안에서는 객체 o를 this

키워드로 가리킬 수 있다. 구체적인 예는 다음과 같다.

var calculator = {   // 객체 리터럴
operand1: 1,
operand2: 1,
compute: function() {
this.result = this.operand1 + this.operand2;
}
};
calculator.compute();   // 1+1은 무엇일까요?
print(calculator.result); // 결과를 출력 한다.


여기서 설명하는 this 키워드는 중요하다. 메서드로 사용되는 함수는 그 메서드가 속해 있는 객체를 암묵적

전달인자로 건네받는다. 대체로 메서드는 그 메서드가 속해 있는 객체에 대해서 무엇인가 연산을 수행하기

때문에, 메서드 형태로 함수를 호출하는 구문은 그 함수가 객체와 관련하여 작동한다는 사실을 표현하는

세련된 방법이라 할 수 있다. 다음 두 줄의 코드를 비교해 보자.

rect.setSize(width, height);
setRectSize(rect, width, height);


위의 코드 두 줄에서 호출한 가상 함수들은 (역시 가상의)객체 rect 위에서 아마도 완전히 동일한 연산을

수행한다. 하지만 첫 번째 줄의 메서드 호출 구문이야말로 이 연산의 주요 초점이 객체 rect임을 명확하게

나타낸다. (만약 첫 번 째 줄의 호출 구문이 더 자연스럽게 보이지 않는다면 아마도 당신이 객체지향적인

방식으로 프로그램을 작성하는데 익숙하지 않기 때문이다.)


만약 함수를 메서드로서가 아니라 함수로 호출했다면 this 키워드는 전역 객체를 가리킨다. 혼란스럽게도,

메서드로 호출된 메서드 안에서 중첩된 함수를 (함수로서) 호출해도 this 키워드는 전역 객체를 하리킨다.

중첩된 함수를 포함하는 함수의 내부에서는 고유한 값인 반면(우리의 직관과는 달리) 중첩된 함수의

내부에서는 전역 객체를 가리킨다.


this가 변수 이름이나 프로퍼티 이름이 아니라 키워드임을 주의하라.

자바스크립트 문법은 this에 다른 값을 할당하는 것을 허용하지 않는다.