Mingyu Kim

Scope

스코프(Scope)는 “변수가 접근 가능하고 유효한 영역”을 의미한다. JavaScript 엔진이 특정 변수를 찾을 때, 어디까지 검색해야 하는지를 정의하는 규칙이라고 생각할 수 있다.

크게 전역 스코프지역 스코프가 있다.

전역 스코프 (Global Scope)

지역 스코프 (Local Scope)

함수 스코프 (Function Scope)

function calculate() {
  var a = 10; // 함수 스코프
  if (true) {
    var b = 20; // 여전히 함수 스코프 내부에 존재
    console.log(b); // 20
  }
  console.log(b); // 20 (if 블록 밖이지만 함수 내이므로 접근 가능)
}

// console.log(a); // 에러: 함수 밖에서는 a에 접근 불가능

블록 스코프 (Block Scope)

function checkScope() {
  let c = 30; // 함수 스코프 겸 외부 블록 스코프
  if (true) {
    let d = 40; // if문 블록 스코프
    console.log(c); // 30 (외부 스코프 접근 가능)
  }
  // console.log(d); // 에러: d는 if 블록 스코프 밖에서는 접근 불가능
}

중첩 스코프와 렉시컬 스코프 (Lexical Scope)

JavaScript는 렉시컬 스코프(Lexical Scope) 규칙을 따른다. 이는 정적 스코프(Static Scope)라고도 불린다.

렉시컬 스코프 정의

스코프 체인 (Scope Chain)

const globalVar = "전역 변수"; // 1. 전역 스코프

function outerFunction() {
  const outerVar = "외부 함수 변수"; // 2. outerFunction 스코프

  function innerFunction() {
    const innerVar = "내부 함수 변수"; // 3. innerFunction 스코프

    // 3번 스코프에서 2번, 1번 변수 모두 접근 가능
    console.log(innerVar); // 접근 가능 (자신의 스코프)
    console.log(outerVar); // 접근 가능 (바깥 스코프)
    console.log(globalVar); // 접근 가능 (최상위 스코프)
  }

  innerFunction();
  // console.log(innerVar); // 에러: 안쪽 스코프의 변수에는 접근 불가능
}

outerFunction();

letconst를 사용해야 하는 이유

letconst가 제공하는 블록 스코프는 다음과 같은 이점을 제공

키워드 스코프 유형 장점
var 함수 스코프 유연하지만, 스코프 범위가 넓어 예상치 못한 값 변경 및 충돌 위험이 높음.
let, const 블록 스코프 스코프 범위가 좁아 변수가 필요한 곳에서만 사용되어 변수 관리 용이성코드 안정성이 높아짐.