this 바인딩
제리2026.03.16
loading ...
| 항목 | 내용 |
| 주차 | 2주차 |
| 날짜 | 2026-03-16 |
| 주제 | this 바인딩 |
| 발표자 | 이세비 |
이 주제를 한 문장으로 설명하면?
한 줄 요약:
"this는 함수가 어떻게 정의됐는지가 아니라, 어떻게 호출됐는지에 따라 달라지는 동적인 참조값이다."
관련 키워드 (마인드맵 형태로 나열):
[this 바인딩]├── 바인딩 규칙│ ├── 전역 바인딩 (기본 바인딩)│ ├── 암묵적 바인딩 (메서드 호출)│ ├── 명시적 바인딩 (call / apply / bind)│ └── new 바인딩├── 화살표 함수 (Lexical this)│ └── 상위 스코프의 this를 정적으로 캡처├── 실행 컨텍스트│ ├── 호출 시점에 결정│ └── strict mode 영향(기본 바인딩에서만 this가 window vs undefined로 달라진다)└── 실무 적용├── 이벤트 핸들러├── setTimeout / setInterval└── React 클래스 컴포넌트
⚠️ 단순 복붙 금지! 반드시 자신의 말로 재작성할 것
개념 설명 (내 말로):
this 는 “지금 이 함수를 누가 실행하고 있나요?”에 대한 대답이다. 자바스크립트에서 this 는 함수가 작성된 위치가 아닌, 함수가 호출되는 방식에 따라 값이 결정된다.
동작 원리 / 흐름:
실제 코드 예시:
function introduce() {console.log(this.name);}const person = { name: '세비', introduce };// 같은 함수지만, 호출 방식에 따라 this가 달라진다
개념 설명 (내 말로):
this 가 결정되는 데는 4가지 규칙이 있다. 우선순위는 아래 순서 그대로다. new 바인딩 > 명시적 바인딩 > 암묵적 바인딩 > 기본 바인딩
동작 원리 / 흐름:
실제 코드 예시:
// ① 기본 바인딩function greet() {console.log(this); // window 또는 undefined('use strict')}greet();// ② 암묵적 바인딩 - 점(.) 앞의 객체가 thisconst user = {
개념 설명 (내 말로):
화살표 함수는 자신만의 this를 가지지 않는다. 화살표 함수가 정의된 시점에서 자신을 감싸는 바깥 스코프의 this를 그대로 가져온다. 이것을 Lexical this 라고 부른다.
동작 원리 / 흐름:
실제 코드 예시:
// ❌ 일반 함수 콜백 - this가 의도치 않게 바뀜const timer = {name: '타이머',start() {setTimeout(function () {console.log(this.name); // undefined (전역 바인딩)
이 기술/개념이 왜 이런 방식으로 만들어졌는지 배경을 이해하자
call vs apply vs bind
| 구분 | call | apply | bind |
| 실행 여부 | 즉시 실행 | 즉시 실행 | 새 함수 반환 |
| 인자 전달 방식 | 쉼표로 나열 | 배열로 전달 | 쉼표로 나열 |
| 사용 시점 | 한 번만 호출할 때 | 배열 형태 인자가 있을 때 | 나중에 호출하거나 재사용할 때 |
| 예시 | fn.call(obj, a, b) | fn.apply(obj, [a, b]) | const f = fn.bind(obj) |
일반 함수 vs 화살표 함수의 this
| 구분 | 일반 함수 | 화살표 함수 |
| this 결정 시점 | 호출 시점 (동적) | 정의 시점 (정적) |
| this 변경 가능 여부 | call/apply/bind로 가능 | 불가능 |
| 객체 메서드로 사용 | ✅ 적합 | ❌ 부적합 (this가 외부 스코프를 참조) |
| 콜백 함수로 사용 | ❌ this 유실 주의 | ✅ 외부 this 캡처 |
실제 프로젝트에서 마주칠 수 있는 상황
면접관 앞에서 말하듯이 작성. 읽는 용도가 아니라 말하는 연습을 위한 섹션
[도입 - 핵심 정의 먼저]"this는 함수가 실행되는 시점에 결정되는, 현재 실행 맥락을 가리키는 참조값입니다."[부연 - 왜/어떻게]"this가 필요한 이유는 같은 함수를 다양한 객체의 메서드로 재사용할 수 있게 하기 위해서입니다.결정 방식은 크게 네 가지로, 일반 호출 시에는 전역 객체, 메서드 호출 시에는 점 앞의 객체,call/apply/bind 사용 시에는 명시한 객체, new로 호출하면 생성된 인스턴스가 this가 됩니다."[마무리 - 실무 연결]"실제로 저는 프로젝트에서 setTimeout 콜백에 일반 함수를 썼다가 this 유실 버그를 경험했고,화살표 함수로 교체해서 해결했습니다. 이후에는 콜백에서는 화살표 함수, 객체 메서드에서는 일반 함수를 쓰는 패턴을 팀 컨벤션으로 정리했습니다."
면접관이 바쁠 때, 딱 1분 안에 설명하는 버전
this는 호출 방식에 따라 값이 달라지는 키워드입니다.메서드로 호출되면 앞의 객체, call/apply/bind를 쓰면 지정한 객체,new로 호출하면 새 인스턴스, 단독 호출이면 전역 객체(strict 모드에서는 undefined)입니다.화살표 함수는 자신만의 this가 없고, 선언된 위치의 this를 그대로 사용합니다.
각 질문에 대해 STAR 구조 혹은 두berlingo 두berlingo 두 문장 요약으로 작성
A: this는 함수가 호출되는 방식에 따라 바인딩되는 값입니다. 자바스크립트에서 this 는 함수가 정의된 위치가 아니라 호출 방식에 따라 동적으로 결정됩니다. 예를 들어 객체의 메서드로 호출하면 그 객체가 this가 되고, 일반 함수 호출에서는 전역 객체가 this가 됩니다.
A: 세 가지 모두 this를 명시적으로 지정하는 방법이지만, 실행 방식에 차이가 있습니다. call 과 apply 는 함수를 즉시 호출하고, bind 는 this 가 고정된 새 함수를 반환합니다. call 은 인자를 쉼표로 나열하고, apply 는 배열로 전달합니다. 이벤트 핸들러처럼 나중에 호출되는 경우에는 bind 를 씁니다.
A: 일반 함수는 호출 방식에 따라 this 가 동적으로 결정되지만, 화살표 함수는 자신만의 this 를 갖지 않고 선언된 스코프의 this 를 정적으로 캡처합니다. 따라서 call, apply, bind 로 화살표 함수의 this 를 변경하는 것은 불가능합니다.
const obj = {name: '세비',getName: function () {const inner = function () {return this.name;
A: obj.getName()을 호출하면 getName 내부의 this는 암묵적 바인딩으로 obj가 됩니다. 하지만 inner 함수는 객체를 통해 호출된 것이 아니라 단순히 inner() 형태로 호출되므로 기본 바인딩이 적용됩니다. 따라서 inner 내부의 this는 전역 객체(window) 또는 strict mode에서는 undefined가 됩니다. 이 문제를 해결하려면 화살표 함수를 사용해 외부 this를 캡처하거나 bind를 사용해 this를 명시적으로 바인딩할 수 있습니다.
A: 클래스 메서드를 JSX의 onClick={this.handleClick} 형태로 전달하면, 실제 클릭 시 함수는 객체 없이 단독으로 호출됩니다. 이 경우 strict mode가 기본인 React에서 this 는 undefined 가 되어 this.setState 등을 호출할 수 없습니다. 생성자에서 this.handleClick = this.handleClick.bind(this) 를 해주면 this가 컴포넌트 인스턴스로 고정됩니다. 현대적인 방식으로는 화살표 함수 클래스 필드(handleClick = () => {})를 사용하면 bind 없이도 동일한 효과를 얻을 수 있습니다.
A: 화살표 함수는 자신만의 this가 없으므로, 객체 메서드로 정의하면 this가 해당 객체가 아닌 외부 스코프의 this(보통 전역 객체)를 가리킵니다. 때문에 객체 메서드에는 반드시 일반 함수 또는 메서드 단축 표기법(greet() {})을 사용해야 합니다.
const user = {name: '세비',greet: () =>
개념을 몸으로 익히기 위한 미니 실습
// 1️⃣ 4가지 바인딩 규칙 확인function printBrand() {console.log('브랜드:', this?.brand || '없음 (전역/undefined)');}const kia = { brand: '기아',
공부하고 나서 진짜 내 머릿속에 남은 것들만 정리
| 헷갈린 것 | 알고 보니 |
| setTimeout(obj.method)을 넘겨도 this가 obj일 줄 알았다 | 함수 참조만 전달되면 객체 컨텍스트가 사라져 기본 바인딩이 된다 |
| bind를 두 번 하면 마지막 것으로 덮어쓸 줄 알았다 | 첫 번째 bind가 영구적으로 고정되어, 재바인딩이 불가능하다 |
| 객체 메서드에서도 화살표 함수 쓰면 어떻게 되나? | 객체 메서드의 화살표 함수는 this가 전역을 가리켜 오히려 버그를 유발한다 |
| 자료 | 링크 | 추천 이유 |
| MDN - this | https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/this | this의 모든 케이스를 정리한 공식 문서 |
| MDN - Function.prototype.bind() | https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Function/bind | bind 동작 원리와 예제 |
| javascript.info - 함수 바인딩 | https://ko.javascript.info/bind | 한국어로 읽기 쉬운 실용적 설명 |