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

Contact Me

© 2026 SEOJing. All rights reserved.

프론트엔드스터디JavaScript객체함수스코프호이스팅

프론트엔드 스터디 대면 7주차: 객체, 함수, 스코프

2026년 5월 2일·12분 읽기

1. 저번 주 복습

지난주에는 JavaScript를 시작하며 타입 시스템, var/let/const, 암묵적 타입 변환, 단축 평가를 배웠습니다. 핵심만 빠르게 짚어보겠습니다.

타입 시스템

  • 동적 타입 언어: 변수에 어떤 타입이든 넣을 수 있고, 런타임에 타입이 결정
  • 원시 타입 7가지: number, string, boolean, undefined, null, symbol, bigint
  • typeof null === 'object': JS 초기 설계 버그, 하위 호환을 위해 유지
  • NaN === NaN은 false: NaN 확인은 Number.isNaN() 사용

var / let / const

  • var: 함수 스코프, 재선언 가능, 호이스팅 시 undefined — 사용 지양
  • let: 블록 스코프, 재선언 불가, TDZ로 선언 전 접근 시 ReferenceError
  • const: 블록 스코프, 재선언·재할당 불가. 단, 객체 내부 변경은 가능
  • 실무 원칙: 기본 const, 재할당 필요 시 let, var는 쓰지 않음

암묵적 타입 변환 & 단축 평가

  • '5' + 1 = '51': +는 문자열 우선, '5' - 1 = 4: -는 숫자 변환 시도
  • === 사용: ==는 타입 변환 후 비교하므로 예측 불가 — 항상 ===
  • ||: 왼쪽이 falsy면 오른쪽 반환 (기본값 패턴)
  • &&: 왼쪽이 truthy면 오른쪽 반환 (조건부 실행 패턴)

자주 헷갈리는 포인트 — 코드로 확인

참조 복사의 함정

원시 타입(숫자, 문자열 등)은 값이 복사되지만, 객체는 참조(주소)가 복사됩니다. 같은 객체를 두 변수가 바라보게 되므로 한쪽을 바꾸면 다른 쪽도 바뀝니다.

js
// 원시 타입 — 값 복사 (독립적)
let a = 1;
let b = a;
b = 99;
console.log(a); // 1 — 영향 없음

// 객체 — 참조 복사 (같은 객체를 가리킴)
const obj1 = { x: 1 };
const obj2 = obj1; // obj2는 obj1과 같은 객체를 가리킴
obj2.x = 99;
console.log(obj1.x); // 99 — !obj1도 바뀜!

일급 객체가 왜 중요한가 — React와 연결

함수가 일급 객체라는 것은 함수를 값처럼 다룰 수 있다는 뜻입니다. 이게 왜 중요할까요? React에서 매일 쓰는 코드가 이 덕분에 동작합니다.

jsx
// React에서 이벤트 핸들러를 전달하는 코드
function App() {
  const handleClick = () => alert("클릭!");

  // handleClick 함수를 값으로 전달 — 일급 객체이기 때문에 가능
  return <button onClick={handleClick}>클릭</button>;
}

// 배열 메서드에 함수를 인자로 전달하는 것도 같은 원리
const nums = [1, 2, 3];
const doubled = nums.map((n) => n * 2 

렉시컬 스코프 — 함수는 작성된 곳의 규칙을 따른다

"함수가 어디서 호출되는지"가 아니라 "어디서 작성되었는지"가 스코프를 결정합니다. 전학생 비유로: 학생이 다른 반에 놀러 가도(호출 위치), 소속 반(선언 위치)의 규칙을 따르는 것과 같습니다.

js
const x = 1; // 전역에서 선언

function foo() {
  console.log(x); // foo는 전역에서 작성됨 → 전역의 x를 봄
}

function bar() {
  const x = 2; // bar 안의 x
  foo(); // foo를 bar 안에서 호출해도...
}

bar(); // 1 출력 — foo는 전역에서 작성됐으므로 전역의 x(1)를 참조

2. 저번 주 과제 정답 및 풀이

인증 미션 과제

Q1. 함수 선언식은 호이스팅되어 선언 전에 호출할 수 있습니다. 그런데 함수 표현식(const fn = function() {})은 선언 전에 호출하면 TypeError가 발생합니다. ReferenceError가 아니라 왜 TypeError인지, 호이스팅 과정을 단계별로 설명하세요.

정답

함수 선언식은 선언과 초기화가 함께 호이스팅되어 함수 전체가 올라갑니다. 반면

var 함수 표현식은 변수 선언만 호이스팅되고 값(함수)은 undefined

상태입니다. undefined()를 호출하면 "undefined is not a function"이라는 TypeError가 발생합니다. const/let 표현식은 TDZ 때문에 ReferenceError가 먼저 납니다.

흔한 오답 패턴

"호이스팅이 안 돼서 에러가 난다"고 답하는 경우가 많습니다.

호이스팅은 일어났지만, 값이 undefined인 상태에서 호출해서 나는 에러

라는 점이 핵심입니다.


Q2. 아래 코드의 실행 결과를 예측하고, 렉시컬 스코프 개념을 사용해 이유를 설명하세요.

js
const x = "global";

function foo() {
  console.log(x);
}

function bar() {
  const x = "bar";
  foo();
}

bar();

정답: "global"

JS는 렉시컬 스코프(정적 스코프)를 사용합니다. 함수의 상위 스코프는 "호출 위치"가 아니라 "선언 위치"에 의해 결정됩니다. foo는 전역에서 선언됐으므로 어디서 호출하든 전역 스코프의 x를 참조합니다.

흔한 오답 패턴

bar() 내부에서 호출했으니 bar의 x인 "bar"가 출력된다고 예측하는 경우가 많습니다. 이는 동적 스코프 방식의 사고입니다. JS는 렉시컬 스코프이므로 선언 위치가 기준입니다.


Q3. 아래 코드에서 obj1.x의 값은 무엇인가요? 원시값 복사와 참조 복사의 차이를 설명하세요.

js
const obj1 = { x: 1 };
const obj2 = obj1;
obj2.x = 99;
console.log(obj1.x);

정답: 99

객체를 변수에 할당하면 값이 복사되는 것이 아니라 참조(메모리 주소)가 복사됩니다. obj1과 obj2는 같은 객체를 가리키므로 obj2.x를 변경하면 obj1.x도 함께 바뀝니다. 원시값(숫자, 문자열 등)은 값 자체가 복사되어 독립적입니다. 복사본을 만들려면 spread 문법({...obj} )이나 Object.assign()으로 얕은 복사를 해야 합니다.


Q4. IIFE(즉시 실행 함수 표현식)를 사용하는 이유는 무엇인가요? ES6 모듈 시스템이 있는 현재에도 IIFE를 쓰는 경우가 있는지 설명하세요.

정답

IIFE의 핵심은 스코프 격리와 즉시 실행입니다. 모듈 시스템이 보편화되기 전에는 전역 변수 충돌을 막는 사실상 유일한 방법이었습니다. 현재도 다음 경우에 사용됩니다.

  • 레거시 코드 유지보수
  • 즉시 실행이 필요한 초기화 로직
  • 번들러가 모듈을 래핑할 때
  • async IIFE: top-level await가 불가능한 환경에서 비동기 즉시 실행

3. 면접 질문

이번 주 범위와 관련된 실제 면접 질문들입니다. 정답을 외우기보다는 자신만의 말로 설명하는 연습을 해보세요.

Q1. 스코프 체인(Scope Chain)이란 무엇인가요?

변수를 참조할 때 현재 스코프에서 먼저 탐색하고, 없으면 상위 스코프로 순서대로 올라가며 탐색하는 구조입니다. 전역 스코프까지 탐색해도 없으면 ReferenceError가 발생합니다.

js
const a = "전역";

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

  function inner() {
    const c = "inner";
    console.log(c); // "inner" — 자신의 스코프
    console.log(b); // "outer" — 상위 스코프
    console.log(a); // "전역" — 전역 스코프
  }

  inner();
  console.log(c); // ReferenceError — 하위 스코프는 접근 불가

면접 팁: "스코프 체인은 안에서 밖으로만 탐색합니다. 바깥에서 안쪽은 접근할 수 없습니다. 이 구조가 렉시컬 스코프, 나아가 클로저의 기반이 됩니다"라고 정리하면 좋습니다.

Q2. JavaScript에서 함수는 왜 일급 객체(First-Class Object)라고 하나요?

일급 객체란 값처럼 다룰 수 있는 대상을 뜻합니다. JS의 함수는 아래 세 가지가 모두 가능하기 때문에 일급 객체입니다.

  • 변수에 할당 가능: const fn = function() {}
  • 함수의 인자로 전달 가능: arr.map(fn)
  • 함수의 반환값으로 사용 가능: return function() {}

이 특성이 콜백 함수, 고차 함수, 클로저의 근거가 됩니다. React에서 컴포넌트를 props로 넘기거나, 이벤트 핸들러를 전달하는 것도 모두 이 특성 덕분입니다.

Q3. 렉시컬 스코프(Lexical Scope)란 무엇인가요?

함수의 상위 스코프를 함수가 선언된 위치를 기준으로 결정하는 방식입니다. 함수가 어디서 호출되느냐와는 무관합니다.

js
const x = "전역";

function foo() {
  console.log(x);
}

function bar() {
  const x = "bar 내부";
  foo(); // foo를 bar 안에서 호출해도
}

bar(); // "전역" 출력 — foo는 전역에서 선언됐으므로 전역의 x를 참조

면접 팁: "렉시컬 스코프는 클로저가 동작하는 근거입니다. 함수가 선언된 환경(스코프)을 기억하기 때문에, 외부 함수가 종료된 후에도 내부 함수가 외부 변수를 참조할 수 있습니다" 라고 연결해서 답하면 좋습니다.


4. 관련 포스팅

  • 프론트엔드 스터디 6주차 학습 자료: JavaScript 시작 — 타입, 변수, 그리고 JS가 이상한 이유

  • 프론트엔드 스터디 7주차 학습 자료: 객체, 함수, 그리고 스코프


5. 다음 주 안내

다음 주에는 JS에서 가장 어렵다고 꼽히는 개념들을 다룹니다. let/const의 세부 동작, 프로토타입(Prototype) 과 상속, 그리고 일급 객체로서의 함수 심화입니다. 특히 프로토타입은 다른 언어의 클래스 상속과 다른 JS만의 방식이라 처음엔 낯설 수 있습니다. 미리 읽어오면 대면 때 훨씬 이해가 빠릅니다.

다음 주 예습

다음 주 학습 자료(week7)의 얄코 강의를 시청하거나, 스킵 진단 문제 10개를 풀어보세요. 프로토타입은 다른 언어와 다르므로 미리 읽어오면 대면 때 이해가 훨씬 빠릅니다.

포스트 목록

/study/clab-26-1/in-person
파일 12개, 폴더 0개
프론트엔드 스터디 대면 1주차: 프론트엔드 개발자란? 그리고 우리가 배울 것들프론트엔드 스터디 대면 2주차: HTML 마크업과 폼, 그리고 CSS의 시작프론트엔드 스터디 대면 3주차: 폼(Form), CSS 선택자, 그리고 박스 모델프론트엔드 스터디 대면 4주차: 박스 모델 실전, Position과 Flexbox프론트엔드 스터디 대면 5주차: 반응형 웹, CSS Grid, 그리고 CSS 마무리프론트엔드 스터디 대면 6주차: JavaScript 시작 — 타입, 변수, 호이스팅프론트엔드 스터디 대면 7주차: 객체, 함수, 스코프프론트엔드 스터디 대면 8주차: 불변성, 프로토타입, 타입 체크프론트엔드 스터디 대면 9주차: 클로저, Promise, async/await프론트엔드 스터디 대면 10주차: React 입문 전 브릿지 — ES6+ 문법과 에러 처리프론트엔드 스터디 대면 11주차: React 첫 번째 — 컴포넌트, JSX, props프론트엔드 스터디 대면 12주차: React 심화 — useState와 useEffect
)
;
// [2, 4, 6]
}