자바스크립트에서 스코프란

Jin·2022년 3월 1일
0

Javascript

목록 보기
6/22

스코프란 특정 장소에 변수를 저장하고 나중에 그 변수를 찾는 데는 잘 정의된 규칙이 필요한데, 바로 이런 규칙을 일컫습니다.

컴파일러 이론

자바스크립트 (이하 JS)는 일반적으로 동적 언어 또는 인터프리터 언어로 분류하나 사실은 컴파일러 언어입니다.

JS 엔진은 전통적인 컴파일러 언어에서 컴파일러가 하는 일의 상당 부분을 우리가 아는 것보다 세련된 방식을 처리해줍니다.

전통적인 컴파일러 언어의 처리 과정에서는 소스코드가 실행되기 전에 보통 3단계를 거치는데, 이 과정을 컴파일레이션이라고 합니다. 여기서 컴파일의 자세한 과정은 배보다 배꼽이 더 클 수 있으므로 생략하도록 하겠습니다.

JS 엔진이 기존 컴파일러와 다른 점은 JS 컴파일레이션을 미리 수행하지 않아서 최적화할 시간이 많지 않다는 것입니다. 보통 코드 실행 수백만 분의 1초 전에 수행됩니다.

어떤 JS 조각이라도 실행되려면 먼저 컴파일되어야 한다는 것에는 변함이 없습니다.

엔진, 컴파일러, 스코프

  • 엔진은 컴파일레이션의 시작부터 끝까지 전 과정에서 JS 프로그램 실행을 책임집니다.
  • 컴파일러는 파싱과 코드 생성과 관련된 모든 일을 맡습니다.
  • 스코프는 선언된 모든 변수 목록을 작성하고 유지합니다. 또한, 엄격한 규칙을 강제하여 현재 실행 코드에서 변수의 적용 방식을 정합니다.
let a = 2;

위와 같은 변수 선언문이 있다면 이는 실제로는 2가지 과정을 통해 이루어집니다.

  1. 컴파일러가 변수를 선언합니다. (현재 스코프에 같은 변수가 선언되지 않은 경우)
  2. 엔진이 스코프에서 변수를 찾고 변수가 있다면 값을 대입합니다.

스코프는 다른 스코프 안에 중첩될 수 있습니다. 따라서, 대상 변수를 현재 스코프에서 발견하지 못하면 엔진은 다음 바깥의 스코프로 넘어가는 식으로 변수를 찾는데, 끝까지 찾지 못한다면 글로벌 스코프라 부르는 가장 바깥 스코프에 도달할 때까지 계속 됩니다.

스코프 검색 방법은 LHS와 RHS 검색으로 나뉩니다.
RHS 검색은 단순히 특정 변수의 값을 찾는 것과 다를 바 없습니다.
반면, LHS 검색은 값을 넣어야 하므로 변수 컨테이너 자체를 찾습니다.

렉시컬 스코프

개발자가 코드를 작성할 때 함수를 어디에 선언하는지에 따라 정의되는 스코프입니다.

function foo(a) {
  let b = a * 2;

  function bar(c) {
    console.log(a, b, c);
  }

  bar(b * 3);
}

foo(2); // 2, 4, 12
  • 함수의 스코프에서는 c 변수를 확인합니다.
  • foo 함수의 스코프에서는 a, bar, b 변수를 확인합니다.
  • 글로벌 스코프에서는 foo 함수 (변수)를 확인합니다.

bar 함수 입장에서는 a, b, c 변수를 확인해야 하는데 c밖에 해당 스코프에 없기 때문에 점점 검색 스코프의 범위를 키우면서 넓어집니다.

이처럼, 스코프는 목표와 일치하는 대상을 찾는 즉시 검색을 중단하지만, 그렇지 않을 경우 점점 검색하는 스코프가 넓어집니다.

렉시컬 스코프는 나중에 클로저 (closure)를 공부하기 위해 필요한 개념이므로 알아둘 필요가 있습니다.

profile
배워서 공유하기

0개의 댓글