타쿠꺼

this 바인딩 본문

Javascript/Study

this 바인딩

kimtaku 2016. 5. 29. 04:19

this


자바스크립트에서 this는


1. 메서드에서 호출되는 경우, 해당 메서드를 호출한 객체에 바인딩됨.

2. 함수에서 호출되는 경우, 전역객체에 바인딩됨(js에선 window)


2의 경우가 문제인데, 만약 메서드 내에 함수를 정의하는 경우 해당 함수의 this는 메서드가 있는 객체에 바인딩되는게 아니라 전역객체에 바인딩 된다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
var value = 100;
 
var myObject = {
    value: 1,
    func1: function() {
        this.value += 1;
        console.log('func1() called. this.value: ' + this.value);
        
        var func2 = function() {
            this.value += 1;
            console.log('func2() called. this.value: ' + this.value);
            
            var func3 = function() {
                this.value += 1;
                console.log('func3() called. this.value: ' + this.value);
            }
            
            func3();
        }
        
        func2();
    }
};
myObject.func1();

cs


위의 결과는 


func1() called. this.value: 2

func2() called. this.value: 101

func3() called. this.value: 102


와 같이 나타난다. this.value가 2, 3, 4로 나오는게 자연스럽지만 func1의 this는 myObject에 바인딩되고, 내부함수인 func2, 3은 myObject가 아닌 window에 바인딩되기 때문이다. 따라서 객체 밖의 변수 value에 접근하는 것이다.

따라서 이런 객체의 메서드의 내부함수에서 객체에 접근하려면 this를 따로 참조할 수 있게 해줘야 한다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
var value = 100;
 
var myObject = {
    value: 1,
    func1: function() {
        var that = this;
        that.value += 1;
        console.log('func1() called. that.value: ' + that.value);
        
        var func2 = function() {
            that.value += 1;
            console.log('func2() called. that.value: ' + that.value);
            
            var func3 = function() {
                that.value += 1;
                console.log('func3() called. that.value: ' + that.value);
            }
            
            func3();
        }
        
        func2();
    }
};
myObject.func1();

cs


위의 결과는


func1() called. that.value: 2

func2() called. that.value: 3

func3() called. that.value: 4


와 같이 나타난다. 원하는 결과를 보여준다.

'Javascript > Study' 카테고리의 다른 글

코드의 실행 과정  (0) 2016.06.01
동적스코프, 정적스코프  (0) 2016.06.01
난수 만들기  (0) 2016.05.31
프로토타입, 체이닝  (0) 2016.05.29
생성자 함수  (0) 2016.05.29
Comments