PromleeBlog
sitemap
aboutMe

posting thumbnail
자바스크립트 this 바인딩의 4가지 규칙
The 4 Rules of 'this' Binding in JavaScript

📅

🚀

들어가기 전에 🔗

많은 개발자들이 this가 가리키는 대상이 계속해서 바뀌는 것 때문에 큰 혼란을 겪습니다.
어떤 때는 객체를, 어떤 때는 전역 객체를, 또 어떤 때는 undefined를 가리키기도 합니다.

이 혼란을 해결할 단 하나의 황금 열쇠가 있습니다.
그것은 바로, 자바스크립트의 this는 함수가 선언된 위치가 아니라, 함수가
호출
되는 방식에 따라 결정된다는 원칙입니다.
오늘은 this가 결정되는 4가지 명확한 규칙과, 이 모든 규칙을 무시하는 특별한 경우까지 함께 탐구해 보겠습니다.

🚀

this 바인딩의 4가지 규칙 🔗

함수가 '어떻게' 호출되었는지에 따라, this는 아래 4가지 규칙 중 하나를 따르게 됩니다.

1. 전역 바인딩 (Default Binding) 🔗

아무런 문맥 없이,
순수한 함수를 단독으로 호출
했을 때 적용되는 가장 기본적인 규칙입니다.
function sayHello() {
  console.log(this);
}
 
sayHello(); // 브라우저 비엄격 모드에서는 window 객체 출력

2. 암시적 바인딩 (Implicit Binding) 🔗

어떤 객체의 메서드로서 함수를 호출
했을 때 적용되는, 가장 흔한 규칙입니다.
const person = {
  name: '홍길동',
  greet: function() {
    console.log('안녕하세요, 저는 ' + this.name + '입니다.');
  }
};
 
person.greet(); // '안녕하세요, 저는 홍길동입니다.' 출력 (this는 person 객체)
🖐️
함수 자체를 다른 변수에 할당한 뒤 호출하면, 객체와의 연결고리가 끊어져 암시적 바인딩이 깨지고 전역 바인딩이 적용됩니다.

3. 명시적 바인딩 (Explicit Binding) 🔗

this가 무엇을 가리킬지
개발자가 코드로 명시적으로 지정
해주는 방식입니다.
이를 위해 call(), apply(), bind() 라는 세 가지 메서드를 사용합니다.
function introduce(city) {
  console.log(`저는 ${this.name}이고, ${city}에 삽니다.`);
}
 
const user = { name: '이순신' };
 
// introduce 함수의 this를 user 객체로 강제하고, '서울'을 인자로 전달하여 호출
introduce.call(user, '서울'); // '저는 이순신이고, 서울에 삽니다.' 출력

4. new 바인딩 (new Binding) 🔗

new 키워드를 사용하여
생성자 함수를 호출
할 때 적용되는 특별한 규칙입니다.
function Person(name) {
  this.name = name;
  // return this; 가 암묵적으로 존재
}
 
const person1 = new Person('강감찬');
console.log(person1.name); // '강감찬' 출력 (this는 person1 객체)
이미지 제안: 4가지 바인딩 규칙의 우선순위를 보여주는 피라미드. 최상단에 new, 그 아래 bind/call/apply, 암시적, 최하단에 전역(기본)을 배치하여 시각적으로 우선순위를 표현.
바인딩 규칙 우선순위
바인딩 규칙 우선순위

🚀

모든 규칙의 예외: 화살표 함수 (Arrow Functions) 🔗

ES6에 도입된 화살표 함수는 위 4가지 규칙을 따르지 않습니다.
화살표 함수는
자신만의 this를 가지지 않습니다.
대신, 자신을 감싸고 있는
상위 스코프(렉시컬 스코프)의 this를 그대로 물려받아 사용
합니다.
이 특징 때문에, setTimeout이나 map 같은 콜백 함수 내부에서 this가 바뀌는 고질적인 문제를 매우 우아하게 해결할 수 있습니다.
const user = {
  name: '유관순',
  getFriends: function() {
    const friends = ['김구', '안중근'];
    // 화살표 함수는 바깥 함수인 getFriends의 this(user 객체)를 그대로 사용합니다.
    friends.forEach(friend => {
      console.log(`${this.name}의 친구: ${friend}`);
    });
  }
};
 
user.getFriends(); // '유관순의 친구: 김구', '유관순의 친구: 안중근' 정상 출력

🚀

주요 면접 예상 질문 🔗

this의 동작 원리는 자바스크립트의 실행 컨텍스트 이해도를 직접적으로 보여주므로, 반드시 출제되는 질문입니다.

1. 자바스크립트에서 this는 어떻게 결정되나요? 🔗

핵심 원칙을 먼저 제시하는 것이 중요합니다.
자바스크립트의 this는 기본적으로
함수가 호출되는 방식
에 따라 동적으로 결정됩니다.
단독으로 호출되면 전역 객체나 undefined를, 객체의 메서드로 호출되면 그 객체를, new 키워드로 호출되면 새로 생성된 객체를, 그리고 call이나 apply를 사용하면 명시적으로 지정된 객체를 가리키게 됩니다.

2. 일반 함수와 화살표 함수의 this 바인딩 차이점을 설명해주세요. 🔗

두 함수의 근본적인 차이를 설명해야 합니다.
가장 큰 차이는 this를 가지는지 여부입니다.
일반 함수
는 호출 방식에 따라 this가 동적으로 결정되는 자신만의 this를 가집니다.
반면,
화살표 함수
는 자신만의 this를 가지지 않고, 대신 자신을 감싸고 있는
상위 스코프의 this를 그대로 물려받아 사용
합니다.
이러한 렉시컬 this 특성 때문에, 콜백 함수 등에서 this가 달라지는 문제를 쉽게 해결할 수 있습니다.

🚀

결론 🔗

오늘은 자바스크립트의 this 바인딩 원리에 대해 깊이 있게 알아보았습니다.

참고 🔗