목차
1. this가 뭔가?
2. this 바인딩이란?
3. this는 동적으로 바인딩이 된다고 하는데, 바인딩되는 객체가 어떻게 다른가?
1. this가 뭔가?
- 자신이 속한 객체를 가리키는 자기 참조 변수
- 대부분의 객체지향에서의
this
는 클래스로 생성한 인스턴스 객체를 의미하지만, 자바스크립트에선 상황에 따라this
가 바라보는 대상이 달라진다.
2. this 바인딩이란?
- 함수가 호출되는 방식에 따라
this
가 동적으로 결정되는 것 - 대부분 4+1 규칙에 의해 this 바인딩이 이뤄진다.
(1) 기본 바인딩
- 아래에 해당되는 경우가 없을 때 기본적으로 적용되는 규칙. this는 전역 객체(
window
/global
)에 바인딩됨
(2) 암시적 바인딩
- 객체의 메소드로서 호출될 때, 해당 함수를 호출한 객체에 this가 바인딩됨
(3) 명시적 바인딩
call
,apply
,bind
프로토타입 메소드를 이용해 this 바인딩을 코드에서 명시하는 것
const foo = {
a: 20,
}
function bar() {
console.log(this.a);
}
// 1. this를 직접 foo로 바인딩하도록 명시
bar.call(foo); // 20
bar.apply(foo); // 20
// 2. 하드 바인딩 - bind 메소드의 매개변수로 받은 객체가 this로 바인딩된 '함수를 반환'함
const bound = bar.bind(foo)
bound(); // 20
(4) new 바인딩
new
키워드를 통해 인스턴스 객체를 생성했을 때, this는 해당 인스턴스 객체를 참조
(5) 화살표 함수 (ES6)
- 화살표 함수는 앞서 말한 규칙들이 적용되지 않고, Lexical scope가 적용됨. 즉 화살표 함수를 ‘정의’하는 시점의 컨텍스트 객체가 this에 바인딩됨
3. this는 동적으로 바인딩 된다고 하는데, 바인딩되는 객체가 어떻게 다른가?
(1) 전역 공간에서의 this
- 브라우저에서 this는
window
전역 객체(Node.js에서 this는global
전역 객체)
(2) 메소드 내부의 this
- 프로퍼티로 메소드가 할당된 객체에서, 점 표기법이나 대괄호 표기법을 통해 메소드를 호출했을 때, 메소드 내부의 this는 해당 객체를 가리킴
(3) 함수 내부의 this
- 일반 함수는 this가 지정되지 않아 전역 객체를 참조
- 화살표 함수는 this 바인딩 과정이 없어서 상위 스코프의 this를 그대로 활용한다.
(4) 콜백 함수 내부의 this
- 콜백 함수는 제어권을 다른 함수(메소드)에 넘긴 함수이기 때문에, this 또한 제어권이 넘겨진 함수 쪽에서 정해진 규칙에 따라 달라진다.
- ex)
setTimeout
,forEach
와 같은 함수(메소드)는 this를 지정하지 않아 전역 객체를 참조 /addEventListener
메소드는 콜백 함수를 호출할 때, 자신의 this를 상속하도록 정의되어 있음
(5) 생성자 함수 내부의 this
- 인스턴스 객체 자신을 참조
참고 사이트
[JS] 알쏭달쏭 자바스크립트 this 바인딩
Java, C# 같은 객체지향 프로그래밍 언어들은 this라는 키워드를 사용한다(Python 에는 self라는 키워드가 있다). 이때 this가 의미하는 것은 해당 코드를 실행하는 클래스의 인스턴스를 나타낸다. 자바
seungtaek-overflow.tistory.com
자바스크립트 this란 무엇인가
this란 함수를 호출할 때 생성되는 실행 컨텍스트 객체다. this가 가리키는 대상은 어떻게 this가 호출되는지에 따라 다르다. 아래 상황별로 this의 의미를 나눌 수 있다. → 전역 공간에서의 this →
eunjinii.tistory.com
'Front-end > JavaScript' 카테고리의 다른 글
[Moment.js] Moment.js를 이용한 날짜 계산 (0) | 2024.01.30 |
---|---|
[JavaScript] 클로저란? (0) | 2023.06.26 |
[JavaScript] Array 배열 | 삽입, 수정, 삭제하는 법 (0) | 2021.02.19 |
[JavaScript] Date 객체로 시간 차 구하기 (0) | 2021.02.10 |
[JavaScript] 객체(Object) (0) | 2021.02.09 |