this

this는 클래스로 생성한 인스턴스를 의미한다.

전역 환경에서 this는 전역 객체를 가르킨다.

런타임 환경에 따라 node에서 this는 global를 가르키고, browser에서 this는 window를 가르킨다.

 

함수, 메서드에서의 this

// 함수
// 호출 주체를 명시할 수 없기 때문에 this는 전역 객체를 의미
var func = function (x) {
    console.log(this, x);
};

func(1); // global { ... } 1

// 메서드
// 호출 주체를 명시할 수 있어서 this는 해당 객체를 의미한다.
var obj = {
    method: func
};

obj.method(2); // { method:f } 2

 

함수를 호출했을 경우 그 함수 내부의 this는 지정되지 않는다. this가 지정되지 않으면, 전역 객체를 가르키기 때문에

함수를 호출하면 함수 내부에서의 this는 전역 객체가 된다.

 

반면, 메서드를 호출하면 메서드를 호출한 대상이 있기 때문에 이 때의 this는 호출한 객체를 의미한다.

 

var obj = {
    name: 'jung',
    outer: function () {        
        var innerFunc = function () {
            console.log(this); 
        }

        innerFunc();        
    }
};

obj.outer();

 

위 코드에서도 비록 객체 안에 innerFunc() 함수가 있지만

innterFunc() 를 호출하면 this는 전역객체가 된다.

 


 

화살표 함수

ES6에서 도입된 화살표 함수는 this 바인딩 과정 자체가 없어서 this가 존재하지 않는다.

대신, 화살표 함수는 선언될 시점의 상위 스코프가 this로 바인딩된다.

 

obj1 = {
    name: 'jung',
    outer: function () {
        const inner = () => {
            console.log(this);
        }

        inner();
    }
};

obj1.outer();

 

innerFunc를 일반 함수에서 화살표 함수로 바꾼후, 출력하면

this가 전역객체가 아니고 outer: function()으로 바뀐것을 볼 수 있다.

 

obj2 = {
    name: 'jung',
    outer: () => {
        console.log(this)
    }
}

obj2.outer();

 

주의할 점은 앞서 언급했던 선언될 시점에서 상위 스코프가 this로 바인딩 된다는 점인데,

위 코드 처럼 function()으로 감싸주지 않으면 this는 전역객체로 대응된다.

 


콜백 함수

콜백함수에서의 this는 기본적으로 지정되지 않기 때문에 전역객체를 바라본다.

[1, 2, 3, 4, 5].forEach(function (x) {
    console.log(this, x);
});

 

위 코드를 실행해보면 global 전역객체에 대한 정보가 출력되는것을 확인할 수 있다.

'Javascript' 카테고리의 다른 글

[Javascript] 프로토타입 ( Prototype )  (0) 2024.08.22
[Javascript] Random - 난수 생성하기  (0) 2024.08.21
[Javascript] Map  (0) 2024.08.19
[Javascript] 소수 올림, 내림, 반올림  (0) 2024.08.19
[Javascript] var, let, const  (0) 2024.08.12

+ Recent posts