LogoSEO Jing
  • All Posts
  • SEO Jing
  • KD Team
  • CLab CoreTeam
  • Study

Contact Me

© 2026 SEOJing. All rights reserved.

프론트엔드스터디JavaScriptthis실행컨텍스트이터러블

프론트엔드 스터디 심화: this, 실행 컨텍스트, 이터러블

2026년 6월 1일·15분 읽기

심화 학습 자료

  • 학습 챕터: poiemaweb — this / 실행 컨텍스트 / 이터러블
  • 자료 바로가기: 1. this
    1. 실행 컨텍스트
    1. 이터러블과 for...of
  • 딥다이브 요약본 (보충용):

    딥다이브 요약 GitHub

이 자료는 1학기 커리큘럼에서 빠진 JS 심화 내용으로, React를 배우다가 this가 헷갈리거나 면접 준비가 필요한 시점에 참고하는 자료입니다. 지금 당장 읽지 않아도 됩니다. 이런 내용이 있다는 것만 알고 넘어가도 좋습니다.


스킵 진단 문제

이 자료를 지금 읽을 필요가 없다고 판단되면, 나중에 필요할 때 참고하세요. 아래 문제를 막힘없이 풀 수 있다면 넘어가도 좋습니다.

Quiz1 / 10
Q.일반 함수 호출에서 this는 무엇을 가리키나요? (strict mode 아님)

1. this — 상황에 따라 달라지는 참조

JS의 this는 함수가 호출될 때 동적으로 결정됩니다. 선언 위치가 아니라 호출 방식에 따라 다릅니다. (화살표 함수만 예외)

네 가지 this 바인딩 규칙

js
// 1. 일반 함수 호출 — 전역 객체 (strict mode에서는 undefined)
function foo() {
  console.log(this); // window (브라우저)
}
foo();

// 2. 메서드 호출 — 호출한 객체
const obj = {
  name: "철수",
  greet() {
    console.log(this.name); // "철수"
  },
};
obj.greet();

// 3. 생성자 호출 — 새로 생성되는 인스턴스
function  

화살표 함수의 this — 렉시컬 this

js
const timer = {
  name: "타이머",
  start() {
    // 일반 함수 — this가 전역으로 바뀜
    setTimeout(function () {
      console.log(this.name); // undefined
    }, 1000);

    // 화살표 함수 — 상위 스코프(start 메서드)의 this 유지
    setTimeout(() => {
      console.log(this.name); // "타이머"
    }, 1000);
  }

React에서 이벤트 핸들러를 화살표 함수로 쓰는 이유도 이 때문입니다. 클래스 컴포넌트에서 this.handleClick = this.handleClick.bind(this)처럼 bind를 쓰는 것도 같은 문제를 해결하는 방법입니다.


2. 실행 컨텍스트 — 코드가 실행되는 환경

실행 컨텍스트는 코드가 실행될 때 JS 엔진이 생성하는 환경 정보 묶음입니다. 스코프, 호이스팅, 클로저, this가 모두 실행 컨텍스트 안에서 관리됩니다.

js
const x = "전역";

function outer() {
  const y = "outer";

  function inner() {
    const z = "inner";
    console.log(x, y, z); // 스코프 체인으로 탐색
  }

  inner();
}

outer();

// 콜 스택의 변화:
// 1. 전역 실행 컨텍스트 생성 (x 등록)
// 2. outer() 호출 → outer 실행 컨텍스트 생성 (y 등록)
// 3. inner() 호출 → inner 실행 컨텍스트 생성 (z 등록)
// 4. inner 종료 → inner 컨텍스트 제거
// 5. outer 종료 → outer 컨텍스트 제거

각 실행 컨텍스트는 외부 렉시컬 환경에 대한 참조를 가지며, 이것이 스코프 체인과 클로저의 실제 구현 방식입니다.


3. 이터러블과 Set / Map

이터러블이란

Symbol.iterator 메서드를 가진 객체는 이터러블입니다. for...of, 스프레드(...), 구조 분해 할당이 내부적으로 이터러블 프로토콜을 사용합니다.

js
// 배열, 문자열, Map, Set — 모두 이터러블
for (const char of "hello") {
  console.log(char); // h, e, l, l, o
}

const [a, b, ...rest] = new Set([1, 2, 3, 4]);
// a=1, b=2, rest=[3, 4]

Set — 중복 없는 집합

js
// 중복 제거
const arr = [1, 2, 2, 3, 3, 4];
const unique = [...new Set(arr)]; // [1, 2, 3, 4]

// 기본 사용
const set = new Set([1, 2, 3]);
set.add(4);
set.has(2); // true
set.delete(1);

Map — 키-값 저장소

js
// 일반 객체와 달리 어떤 타입이든 키로 사용 가능
const map = new Map();
map.set("name", "철수");
map.set(1, "숫자 키");
map.set({ id: 1 }, "객체 키");

map.get("name"); // "철수"
map.has("name"); // true
map.size; // 3

// 이터러블이라 for...of 가능
for ( key value  map 

📝 학습 이해 퀴즈

아래 코드를 브라우저 콘솔에서 직접 실행해보고 결과를 입력해보세요.

Quiz1 / 3
Q.아래 코드에서 두 console.log의 출력 결과를 순서대로 입력하세요.
js
const obj = {
value: 10,
double: function () {
  return this.value * 2;
},
doubleArrow: () => {
  return this.value * 2;
},
};

console.log(obj.double());
console.log(obj.doubleArrow());

언제 이 내용이 필요한가?

다음 상황에서 이 자료로 돌아오세요.
  • this 관련: React 클래스 컴포넌트를 읽거나, 이벤트 핸들러에서 this가 예상과 다르게 동작할 때
  • 실행 컨텍스트: 면접에서 "호이스팅과 클로저의 원리를 설명하라"는 질문을 받았을 때
  • Set/Map: 중복 제거, 빠른 조회가 필요한 데이터 구조가 필요할 때 (지금 바로 써도 됩니다!)
  • 이터러블: 커스텀 이터레이터를 만들거나, for...of 동작 원리가 궁금할 때

포스트 목록

/study/clab-26-1
파일 13개, 폴더 2개
프론트엔드 스터디 1주차: 마크업 그 이상, 실무를 위한 중급 HTML 가이드프론트엔드 스터디 2주차: 사용자와 소통하는 폼 & CSS의 시작프론트엔드 스터디 3주차: 프론트엔드의 첫 번째 벽, 박스 모델과 스타일링프론트엔드 스터디 4주차: 자유자재 레이아웃 (포지션과 플렉스박스)프론트엔드 스터디 5주차: JavaScript 시작 — 타입, 변수, 그리고 JS가 이상한 이유프론트엔드 스터디 6주차: 객체, 함수, 그리고 스코프프론트엔드 스터디 7주차: 불변성, 프로토타입, 타입 체크프론트엔드 스터디 8주차: 클로저, Promise, async/await프론트엔드 스터디 9주차: React 입문 전 필수 JS 문법 — map, 구조 분해, 스프레드프론트엔드 스터디 10주차: React 기초 1 — 컴포넌트, JSX, props, useState프론트엔드 스터디 11주차: React 기초 2 — useEffect, 이벤트 처리, 폼프론트엔드 스터디 심화: this, 실행 컨텍스트, 이터러블프론트엔드 스터디 심화: 에러 처리와 정규 표현식
Person
(
name
)
{
this.name = name; // 새 인스턴스를 가리킴
}
const p = new Person("영희");
// 4. 명시적 바인딩 — call / apply / bind
function greet() {
console.log(this.name);
}
greet.call({ name: "민수" }); // "민수"
greet.apply({ name: "지수" }); // "지수"
const boundGreet = greet.bind({ name: "하준" });
boundGreet(); // "하준"
,
};
timer.start();
set.size; // 3
// 집합 연산
const a = new Set([1, 2, 3]);
const b = new Set([2, 3, 4]);
const union = new Set([...a, ...b]); // {1, 2, 3, 4}
const intersection = new Set([...a].filter((x) => b.has(x))); // {2, 3}
const
[
,
]
of
)
{
console.log(key, value);
}
// 객체 → Map 변환
const obj = { a: 1, b: 2 };
const mapFromObj = new Map(Object.entries(obj));