자바스크립트 (이하 JS)는 일반적으로 동적 언어 또는 인터프리터 언어로 분류하나 사실은 컴파일러 언어입니다.
JS 엔진은 전통적인 컴파일러 언어에서 컴파일러가 하는 일의 상당 부분을 우리가 아는 것보다 세련된 방식을 처리해줍니다.
전통적인 컴파일러 언어의 처리 과정에서는 소스코드가 실행되기 전에 보통 3단계를 거치는데, 이 과정을 컴파일레이션이라고 합니다. 여기서 컴파일의 자세한 과정은 배보다 배꼽이 더 클 수 있으므로 생략하도록 하겠습니다.
JS 엔진이 기존 컴파일러와 다른 점은 JS 컴파일레이션을 미리 수행하지 않아서 최적화할 시간이 많지 않다는 것입니다. 보통 코드 실행 수백만 분의 1초 전에 수행됩니다.
어떤 JS 조각이라도 실행되려면 먼저 컴파일되어야 한다는 것에는 변함이 없습니다.
let a = 2;
위와 같은 변수 선언문이 있다면 이는 실제로는 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
bar 함수 입장에서는 a, b, c 변수를 확인해야 하는데 c밖에 해당 스코프에 없기 때문에 점점 검색 스코프의 범위를 키우면서 넓어집니다.
이처럼, 스코프는 목표와 일치하는 대상을 찾는 즉시 검색을 중단하지만, 그렇지 않을 경우 점점 검색하는 스코프가 넓어집니다.
렉시컬 스코프는 나중에 클로저 (closure)를 공부하기 위해 필요한 개념이므로 알아둘 필요가 있습니다.