프로그래밍 노트/JAVASCRIPT

[Javascript] 함수의 호출_2 (메서드로 호출)

깡냉쓰 2018. 11. 27. 23:48
728x90
반응형

메서드로 호출


함수를 객체의 프로퍼티로 할당하고, 그 프로퍼티를 사용하여 “참조에 의한 호출”이 일어나면, 함수는 그 객체의 메서드로 호출된다.

1
2
3
var o = {};
o.whatever = function(){};
o.whatever(); // 참조에 의한 호출
cs

우리가 어떤 객체의 메서드로 함수를 호출하면, 그 객체는 함수 컨텍스트가 되고 함수 내에서 this 매개변수로 참조할 수 있다. 

앞에서 “함수로 호출”에서 함수는 window에 “속하고”, window는 함수 컨텍스트로 설정된다.
하지만 위의 예제에서는 객체 o가 함수 컨텍스트가 된다. 

다음은 함수 호출과 메서드 호출의 차이점을 나타내는 코드이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function creep{ return this; }
creep() === window// true
 
var sneak = walk;
senak() === window// true
 
var ninja1 = {
    skulk : creep
};
ninja1.skulk() === ninja1; // true
 
var ninja2 = {
    skulk : creep;
};
ninja2.skulk() === ninja2; // true
cs
 
위의 두 예제 creep, sneak 함수이름으로 호출하면 함수컨텍스트전역 컨텍스트인 winodw가 나올 것이다.
그런다음 함수를 ninja1, ninja2라는 객체의 프로퍼티를 설정한 후 메서드로 함수를 호출하였을 때 함수 컨텍스트그 메서드를 가지고 있는 객체가 된다.

함수가 “어떻게 호출되느냐”에 따라 각 호출에 대한 함수 컨텍스트가 변한다는 것을 유념해야 한다.
ninja1, ninja2는 정확하게 동일한 함수 인스턴스를 공유하고 있다. 하지만 함수가 실행되면 함수는 그 메서드가 호출된 객체에 접근하고, 그 메서드가 호출된 객체에 따라 필요한 연산을 수행한다.

함수를 하나만 정의하고 여러 객체에서 메서드로 사용할 수 있다는 것은 강력한 능력이다.  


728x90
반응형