DYO 공부하는 블로그

[JS] JS의 this 호출 본문

JS

[JS] JS의 this 호출

DYODa 2025. 5. 31. 02:46

JS에서 this.멤버 변수(객체 내에서 선언된 변수) 또는 this.메소드(객체 내에 선언된 함수)를 호출하려고 할 때, window가 선택되거나, 의도하지 않은 객체를 지정하는 경우가 있다. 상황따라 구분하며 this가 어떤 객체를 가리키는지 알아보려고 한다.

 

1. this가 document를 가리키는 경우

1. 전역 함수에서의 this

js
function test() {
  console.log(this);
}
test(); // window (브라우저 환경)

일반적인 함수에서 this는 window를 지정한다.

2. 이벤트 핸들러에 화살표 함수로 선언

document.addEventListener('click', () => {
  console.log(this); // window
});

화살표 함수로 callback(파라미터로 전달되는 함수)를 이벤트 핸들러에 선언했을 경우, this는 해당 이벤트 객체를 가리키지 않고, window를 지정한다.

3. 객체 메서드를 화살표 함수로 선언

const obj = {
  name: '철수',
  sayHello: () => {
    console.log(this.name); // this = window
  }
};
obj.sayHello();

객체 메서드에서 화살표 함수로 선언할 경우 this는 window를 지정한다.

 

2. this가 해당 객체를 가리키는 경우.

당연히 스코프({} 사이에 있는 코드) 안에서 this를 호출해야만 메서드, 함수에서 호출할 수 있다.

1. 객체 메서드를 일반 함수 선언

const obj = {
  name: '철수',
  sayHello: function () {
    console.log(this.name); // '철수'
  }
};
obj.sayHello(); // obj가 this

객체 메서드 안에서는 this가 호출된 객체를 가리킨다.

2. 객체 메서드를 단축 함수(ES6 이후 문법) 선언

const obj = {
  name: '철수',
  sayHello() {
    console.log(this.name); // '철수'
  }
};
obj.sayHello(); // obj가 this

상당히 '객체지향 언어스러운' 메서드 선언 방법이다. ES6이후 추가되었고, this 동작에서는 일반 함수 선언과 똑같이 동작한다.

 

 

3. 일반 함수, 화살표 함수, 단축 함수 비교와 this 호출

  sayHello: function() {console.log(this.name);} // 일반 메서드
  sayHello: () => {console.log(this.name);} // 화살표 메서드
  sayHello(){console.log(this.name);} // 간결한 메서드

메서드 선언방법 세 가지와 비교하며 this 바인딩에 대해서 정리해보려 한다.

메서드 형태 설명
화살표 메서드 간결한 메서드, this가 자동으로 바인딩되지 않음, 상대적으로 가벼움, 콜백 함수로 사용하기 좋음.
일반 메서드 전통적인 선언 방식, this가 자동으로 바인딩됨, 상대적으로 무거움.
간결한 메서드 ES6이후로 추가된 선언 방식, this가 자동으로 바인딩됨, 상대적으로 가벼움.

요약하면, 화살표 메서드는 this 바인딩이 되지 않고, 일반 메서드, 간결한 메서드는 this 바인딩된다. 화살표 함수 선언 / 일반 메서드, 간결한 메서드로 묶어 생각하면 될 것 같다.

하지만 어떠한 경우에도 바인딩 불가능한 것은 아니고, bind(), call(), apply()등과 같은 함수를 이용해 명시적으로 바인딩을 추가해 함수를 호출할 수 있다.

'JS' 카테고리의 다른 글

[JS] for in, for of 기능과 예시  (0) 2025.06.03
[JS] ?. 옵셔널 체이닝(Optional chaining)  (0) 2025.06.02
[JS] JavaScript의 데이터 타입  (0) 2025.05.29
[JS] 호이스팅과 TDZ(Temporal Dead Zone)  (0) 2025.05.29
[JS] ajax  (0) 2025.05.23