| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 정렬
- react
- Mini-React
- 크래프톤 정글
- 그리디
- CSS
- c언어
- 백준
- 해시
- 프론트엔드
- 개발자
- 팀프로젝트
- html
- 정글
- 알고리즘
- Python
- js
- frontend
- 코딩
- 코딩테스트
- 그래프
- DFS
- 알고리즘 기초
- 혼자 공부해서 개발까지
- HTML기초
- 네트워크
- Git
- javascript
- 프론트앤드
- 프로그래머스
Archives
- Today
- Total
민혁이의 IT스토리
[JS 기초] 카멜레온 같은 정체성, this 이해하기 본문
자바스크립트를 공부하다 보면 가장 우리를 당황스럽게 만드는 존재가 있습니다. 바로 this입니다. 상황에 따라, 장소에 따라 그 정체가 변하는 this는 마치 카멜레온 같습니다.
늘 포스팅에서는 this가 결정되는 결정적인 차이인 "누가 나를 불렀는가(호출 방식)"와 "어디서 태어났는가(선언 환경)"의 관점에서 핵심 내용을 정리해 보겠습니다.
메서드 호출: "누가 나를 불렀는가?"
가장 직관적인 형태입니다. 점(.) 앞을 주목하세요. 객체의 메서드로 호출될 때, 그 내부의 this는 메서드를 호출한 객체를 가리킵니다.
const user = {
name: "Gemini",
greet() {
console.log(this.name);
}
};
user.greet(); // 결과: Gemini (점 앞의 'user'가 호출자!)
핵심: obj.method() 형태에서 this는 바로 그 obj입니다.
일반 함수 호출: "주인 없는 호출은 전역으로"
객체의 메서드가 아닌, 일반적인 함수 형태로 호출하면 this는 길을 잃고 전역 객체(Global/Window)를 찾아갑니다.
- 브라우저 환경: window
- Node.js 환경: global
단, 실수를 방지하기 위한 Strict Mode(엄격 모드)에서는 전역 객체를 바인딩하지 않고 undefined를 반환합니다.
function showThis() {
console.log(this);
}
showThis(); // 결과: Window (엄격 모드에선 undefined)
화살표 함수: "나는 태생부터 정해져 있어"
ES6에서 등장한 화살표 함수(Arrow Function)는 기존의 this 규칙을 파괴하는 혁명적인 녀석입니다. 이 친구는 자신만의 this를 아예 가지지 않습니다.
대신 상위 스코프(Lexical Scope)의 this를 그대로 물려받습니다. 즉, "어디서 태어났는지"가 가장 중요합니다.
const runner = {
name: "카멜레온",
run: function() {
setTimeout(() => {
console.log(this.name + "이(가) 달립니다!");
}, 1000);
}
};
runner.run(); // 결과: 카멜레온이(가) 달립니다!
일반 함수였다면 setTimeout 내부의 this는 전역 객체를 가리켰겠지만, 화살표 함수는 상위인 run 메서드의 this(runner 객체)를 그대로 가져옵니다.
| 구분 | 호출 방식 | this의 정체 |
| 메서드 호출 | obj.method() | 점(.) 앞의 객체 (obj) |
| 일반 함수 호출 | func() | 전역 객체 (Strict 모드에선 undefined) |
| 화살표 함수 | () => {} | 상위 스코프의 this (계승) |
마무리
this가 헷갈릴 때는 딱 두 가지만 기억하세요!
- 일반 함수나 메서드라면? → "누가 나를 불렀지?" (호출 시점 결정)
- 화살표 함수라면? → "나는 어디서 만들어졌지?" (선언 시점 결정)
이 규칙만 손에 익히면 더 이상 카멜레온 같은 this 때문에 밤잠 설칠 일은 없을 거예요.
'혼자 공부해서 개발까지 > JavaScript' 카테고리의 다른 글
| [Mini React 만들기 #3] - 리랜더링 구현하기 (0) | 2026.03.20 |
|---|---|
| [Mini React 만들기 #2] - 브라우저가 멈추는 문제를 해결하자: Concurrent Mode와 Fiber 도입기 (0) | 2026.03.13 |
| [Mini React 만들기 #1] - Virtual DOM구현과 렌더링 (2) | 2026.03.10 |
| 실행 컨텍스트가 사라져도 데이터가 남는 이유 (Call Stack vs Closure) (0) | 2026.02.11 |
| var를 쓰면 안 되는 이유: 호이스팅과 TDZ로 알아보는 스코프의 차이 (0) | 2026.02.10 |
