Jake Seo
제이크서 개발 블로그
Jake Seo
전체 방문자
오늘
어제
  • 분류 전체보기 (719)
    • AI 서비스 개발 일기 (3)
    • LLM 개발 일기 (1)
    • ------레거시 (2025.08.23 이전)--.. (0)
    • 백준 문제풀이 (1)
    • 릿코드 문제풀이 (2)
    • 알고리즘 이론 (10)
      • 기본 이론 (2)
      • 배열과 문자열 (8)
    • 데이터베이스 (15)
      • Planet Scale (1)
      • MSSQL (9)
      • 디비 기본 개념 (1)
      • SQLite 직접 만들어보기 (4)
    • 보안 (7)
    • 설계 (1)
    • 네트워크 (17)
      • HTTP (9)
      • OSI Layers (5)
    • 회고 (31)
      • 연간 회고 (2)
      • 주간 회고 (29)
    • 인프라 (52)
      • 도커 (12)
      • AWS (9)
      • 용어 (21)
      • 웹 성능 (1)
      • 대규모 서비스를 지탱하는 기술 (9)
    • 깃 (7)
    • 빌드 도구 (7)
      • 메이븐 (6)
      • 그레이들 (0)
    • Java (135)
      • 이펙티브 자바 (73)
      • 자바 API (4)
      • 자바 잡지식 (30)
      • 자바 디자인 패턴 (21)
      • 톰캣 (Tomcat) (7)
    • 프레임워크 (64)
      • next.js (14)
      • 스프링 프레임워크 (28)
      • 토비의 스프링 (6)
      • 스프링 부트 (3)
      • JPA (Java Persistence API) (5)
      • Nest.js (8)
    • 프론트엔드 (48)
      • 다크모드 (1)
      • 노드 패키지 관리 매니저 (3)
      • CSS (19)
      • Web API (11)
      • tailwind-css (1)
      • React (5)
      • React 새 공식문서 요약 (1)
      • HTML (Markup Language) (5)
    • 자바스크립트 (108)
      • 모던 자바스크립트 (31)
      • 개념 (31)
      • 정규표현식 (5)
      • 코드 스니펫 (1)
      • 라이브러리 (6)
      • 인터뷰 (24)
      • 웹개발자를 위한 자바스크립트의 모든 것 (6)
      • 팁 (2)
    • Typescript (49)
    • 리눅스와 유닉스 (10)
    • Computer Science (1)
      • Compiler (1)
    • IDE (3)
      • VSCODE (1)
      • IntelliJ (2)
    • 세미나 & 컨퍼런스 (1)
    • 용어 (개발용어) (16)
      • 함수형 프로그래밍 용어들 (1)
    • ORM (2)
      • Prisma (2)
    • NODEJS (2)
    • cypress (1)
    • 리액트 네이티브 (React Native) (31)
    • 러스트 (Rust) (15)
    • 코틀린 (Kotlin) (4)
      • 자바에서 코틀린으로 (4)
    • 정규표현식 (3)
    • 구글 애널리틱스 (GA) (1)
    • SEO (2)
    • UML (2)
    • 맛탐험 (2)
    • 리팩토링 (1)
    • 서평 (2)
    • 소프트웨어 공학 (18)
      • 테스팅 (16)
      • 개발 프로세스 (1)
    • 교육학 (1)
    • 삶의 지혜, 통찰 (1)
    • Chat GPT (2)
    • 쉘스크립트 (1)
    • 컴파일 (2)
    • Dart (12)
    • 코드팩토리의 플러터 프로그래밍 (4)
    • 플러터 (17)
    • 안드로이드 스튜디오 (1)
    • 윈도우즈 (1)
    • 잡다한 백엔드 지식 (1)
    • 디자인 패턴 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • pnpm
  • rust
  • 팩터리 메서드 패턴
  • item7
  • MSSQL
  • 싱글턴
  • Pre-rendering
  • item8
  • 자바스크립트 면접
  • 자바스크립트
  • 싱글톤
  • Java
  • serverless computing
  • item9
  • Javadoc 자바독 자바주석 주석 Comment
  • 객체복사
  • 토비의 스프링
  • 메이븐 라이프사이클
  • 자바 디자인패턴
  • 디자인패턴
  • 메이븐 페이즈
  • next js app
  • 자바
  • 빈 검증
  • 추상 팩터리 패턴
  • prerendering
  • 스프링 검증
  • 슬로우 쿼리
  • 메이븐 골
  • bean Validation
  • 자바 검증
  • Next.js
  • 외래키 제약조건
  • 자료구조
  • 서버리스 컴퓨팅
  • 이펙티브 자바
  • 플라이웨이트패턴
  • 러스트
  • 자바스크립트 인터뷰
  • NEXT JS
  • 이펙티브 자바 item9
  • 작업기억공간
  • 이펙티브자바
  • 싱글톤 패턴
  • 느린 쿼리
  • try-with-resources
  • 알고리즘
  • 참조 해제
  • 프로그래머의 뇌
  • 도커공식문서

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Jake Seo

제이크서 개발 블로그

자바스크립트/개념

Lexical Scope (렉시컬 스코프) 란? (자바스크립트의 스코핑 방식)

2023. 2. 2. 20:58

개요

  • 자바스크립트에서는 렉시컬 스코프(Lexcial Scope) 라는 스코핑 방식을 이용한다.
  • 이는 굉장히 낯설은 영단어로 처음 스코프 개념을 접하는 프로그래밍 초보자들에게 많은 혼란을 준다.

Lexical Scope 란?

  • Lexical Scope 란 한글로 번역하면 어휘적 스코프이다.
    • 어휘적 스코프라는 말을 들었을 때 이 스코핑 방식에 대해 이해한다면, 당신은 프로그래밍 고인물일 확률이 높다.
  • Lexical Scope 는 Static Scope (정적 스코프) 라고도 불리운다.
    • 정적 스코프라고 불리우는 이유는 스코프가 컴파일 타임에 결정되고 변하지 않기 때문이다.
  • 런타임에 스코핑을 지원하는 Dynamic Scope 와 다른 방식의 스코프이다.

왜 이름이 Lexical Scope 인가?

  • Lexical Scope 라는 작명은 많은 사람들이 Lexical Scope 에 대해 이해하기 어렵게 만든다.
    • 차라리 Static Scope 라는 이름이 훨씬 와닿는다.

영단어 중 Lexicon 이라는 단어가 있다. Lexicon 은 특정 분야, 개인, 집단에서 사용하는 어휘를 일컫는다. Lexical 은 Lexicon 의 형용사 형태로 단순히 '어휘의' 라는 의미를 가진다. 우리는 사실 Lexical 보다 Lexicon 의 의미에 집중해볼 필요가 있다. Lexicon 은 '특정 분야, 개인, 집단에서 사용하는' 어휘이다. 그 말은 전체가 쓴다기보다는 어떤 한정된 블록 내에서 사용한다는 뜻이다. Lexical Scope 를 '정의된 특정한 구역 내에서 사용하는 스코핑 방식' 정도로 해석하면 적당할 것이라 생각한다.

Lexical Scope (Static Scope) vs Dynamic Scope

  • 두 방식을 비교하면 어떤 차이가 있는지 간단히 이해 된다.

Lexical Scope (Static Scope)

function getPersonName() {
  let personName = "local jake"; // 지역 변수
  return `my name is ${personName}`;
}

function printName() {
  let name = getPersonName();
  console.log(name);
  return name;
}

printName();
  • 아무런 문제 없는 정상적인 코드이다.
  • printName() 에서 자바스크립트 파서가 어떻게 personName 을 해석하는지가 Lexical Scope 의 핵심이다.
  • 런타임을 참조하지 않고, 정적으로 블록별 스코프 체인을 따라 전역 스코프까지 올라가서 변수의 이름을 찾아낸다.
    • 이 경우엔 getPersonName() 함수 내부에서 쉽게 찾을 수 있었다.

Dynamic Scope

function getPersonName() {
  return `my name is ${personName}`;
}

function printName() {
  let personName = "local jake"; // 지역 변수
  let name = getPersonName();
  console.log(name);
  return name;
}

printName();
  • 딱 봐도 오류가 발생할 것 같다.
  • 그런데 다이나믹 스코프라는 전제 하에서는 유효한 코드일 수 있다.
  • 다이나믹 스코프는 런타임에 변수가 체크된다.
  • 사용해본적은 없지만, Lisp, Closure (부분적으로) 와 같은 언어에서 사용된다고 한다.

레퍼런스

What is Lexical Scope
MDN - Lexical Scoping
Explain lexical scope in plain english

저작자표시 비영리 (새창열림)

'자바스크립트 > 개념' 카테고리의 다른 글

매크로 태스크 (Macro Task) 와 마이크로 태스크 (Micro Task) 란?  (0) 2023.02.13
자바스크립트의 실행 컨텍스트 (Execution Context) 란?  (0) 2023.02.05
이터러블 스프레드 문법이란?  (0) 2023.01.31
전개 구문, 속성 스프레드 구문 (Spread Syntax) 이란?  (0) 2023.01.02
자바스크립트 Object.assign() 메서드란?  (0) 2023.01.01
    '자바스크립트/개념' 카테고리의 다른 글
    • 매크로 태스크 (Macro Task) 와 마이크로 태스크 (Micro Task) 란?
    • 자바스크립트의 실행 컨텍스트 (Execution Context) 란?
    • 이터러블 스프레드 문법이란?
    • 전개 구문, 속성 스프레드 구문 (Spread Syntax) 이란?
    Jake Seo
    Jake Seo
    ✔ 댓글로 틀린 부분을 지적해주시면 기분 나빠하지 않고 수정합니다. ✔ 많은 퇴고를 거친 글이 좋은 글이 된다고 생각합니다. ✔ 간결하고 명료하게 사람들을 이해 시키는 것을 목표로 합니다.

    티스토리툴바