자바스크립트를 공부하다 보면 this 키워드가 정말 헷갈립니다.

함수 안에서 썼을 때는 객체를 가리키더니, 어떤 때는 undefined가 나오고,

어떤 때는 window를 가리킵니다.

 

왜 그럴까요?

 

그 이유는 자바스크립트의 this가 “동적 바인딩”이라는 규칙을 따르기 때문입니다.

 

this란?

this는 “현재 실행 중인 함수가 누구를 통해 호출됐는가“에 따라 달라지는 실행 컨텍스트의 참조값입니다.

 

 

예제 1: 객체 메서드에서의 this

const person = {
  name: "Alice",
  greet: function () {
    console.log("Hi, I'm " + this.name);
  }
};

person.greet(); // 👉 this는 person을 가리킴 → 출력: Hi, I'm Alice

❗ 그런데 변수에 옮기면?
const greetFn = person.greet;
greetFn(); // ❌ this는 undefined (strict mode) 또는 window (비엄격 모드)

 

greetFn()은 이제 객체 없이 단독으로 호출되고 있습니다.

즉, 이 시점에서 this는 더 이상 person이 아닙니다.

 

  • 브라우저 환경에서는 기본적으로 window를 가리킴
  • 'use strict' 모드에서는 undefined

 

👉 이것이 자바스크립트의 동적 바인딩입니다.

호출되는 방식에 따라 this가 달라지는 것이죠

 

 

예제 2: setTimeout과 일반 함수

const counter = {
  value: 0,
  increase: function () {
    setTimeout(function () {
      console.log(this.value); // ❌ this는 counter가 아님
    }, 1000);
  }
};

counter.increase(); // 출력: undefined

setTimeout의 콜백 함수는 단독으로 호출되기 때문에,

그 안의 thiswindow 또는 undefined가 됩니다.

 

 

해결법 1: this를 변수에 저장 (var that = this 패턴)

const counter = {
  value: 0,
  increase: function () {
    const that = this;
    setTimeout(function () {
      console.log(that.value); // ✅ that은 counter를 가리킴
    }, 1000);
  }
};

전통적인 방식입니다. 외부 thisthat에 복사해두고, 콜백에서 사용합니다.

 

해결법 2: 화살표 함수 사용

const counter = {
  value: 0,
  increase: function () {
    setTimeout(() => {
      console.log(this.value); // ✅ 화살표 함수는 this를 바깥에서 가져옴
    }, 1000);
  }
};

화살표 함수는 this를 만들지 않고, 자신이 정의된 위치의 this를 그대로 사용합니다.

위 코드에서는 increase() 메서드의 thiscounter이므로, 콜백 안에서도 그대로 유지됩니다.

 

 

주의: 화살표 함수를 객체 메서드로 직접 정의하면?

const user = {
  name: "Jane",
  greet: () => {
    console.log("Hi, I'm " + this.name); // ❌ this는 user가 아님
  }
};

user.greet(); // 출력: Hi, I'm undefined

화살표 함수는 객체의 메서드로 사용하면 안 됩니다.

그 정의 시점의 this는 전역 스코프(window/global)이기 때문이에요.

 

 

요약

상황 this가 가리키는 대상
객체의 메서드에서 호출 해당 객체
일반 함수에서 호출 전역 객체 (window) 또는 undefined
화살표 함수 정의된 시점의 외부 this를 유지
setTimeout, setInterval 기본적으로 전역 또는 undefined
메서드를 변수에 저장 후 호출 전역 또는 undefined

 

 

마무리

자바스크립트의 this어디서 정의되었느냐보다, 어떻게 호출되었는지에 따라 값이 결정됩니다.

이것이 바로 동적 바인딩의 원리입니다.

 

그리고 이 불편함을 해소하기 위해 나온 것이 바로 화살표 함수(arrow function)입니다.

화살표 함수는 this를 고정시켜서, 의도하지 않은 바인딩 오류를 줄여줍니다.

'Server > node.js' 카테고리의 다른 글

자바스크립트의 const, let, var  (0) 2025.06.09
무작위 키 발급하는 방법 (Node.js 활용)  (0) 2025.03.10

+ Recent posts