반응형
메서드로 호출
함수를 객체의 프로퍼티로 할당하고, 그 프로퍼티를 사용하여 “참조에 의한 호출”이 일어나면, 함수는 그 객체의 메서드로 호출된다.
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는 정확하게 동일한 함수 인스턴스를 공유하고 있다. 하지만 함수가 실행되면 함수는 그 메서드가 호출된 객체에 접근하고, 그 메서드가 호출된 객체에 따라 필요한 연산을 수행한다.
함수를 하나만 정의하고 여러 객체에서 메서드로 사용할 수 있다는 것은 강력한 능력이다.
반응형
'프로그래밍 노트 > JAVASCRIPT' 카테고리의 다른 글
[Javascript] 함수의 호출_4 (apply(), call() 메서드 사용) (0) | 2018.11.28 |
---|---|
[Javascript] 함수의 호출_3 (생성자로 호출, 생성자의 기능) (0) | 2018.11.27 |
[Javascript] 함수의 호출_1 (함수로 호출) (0) | 2018.11.27 |
[Javascript] 자바스크립트 함수에서 argument와 this (0) | 2018.11.27 |
[Javascript] 함수 (0) | 2018.11.26 |