스코프

  • 엔진: 컴파일레이션의 시작부터 끝까지 전 과정과 자바스크립트 프로그램 실행을 책임진다

  • 컴파일러: 엔진의 친구로, 파싱과 코드 생성의 모든 잡일을 도맡아 한다

  • 스코프: 엔진의 또 다른 친구로, 선언된 모든 확인자(변수) 검색 목록을 작성하고 유지한다. 또한 엄격한 규칙을 강제하여 현재 실행 코드에서 확인자의 적용 방식을 정한다

렉시컬 스코프

스코프는 자바스크립트 엔진이 확인자 이름으로 현재 스코프 또는 중첩 스코프 내에서 변수를 찾을 때 사용하는 '규칙의 집합'

자바스크립트는 스코프가 작동하는 방식으로 렉시컬 스코프를 택함

function foo(a) {                        // (1)

    var b = a * 2;                   // (2)

    function bar(c) {         

        console.log(a, b, c);    // (3)
    }

    bar(b * 3);                      // (2)
}
foo(2);                                  // (1)

버블(1)은 글로벌 스코프를 감싸고 있고 해당 스코프 안에는 오직 하나의 확인자(foo)만 있다

버블(2)는 foo의 스코프를 감싸고 있고, 해당 스코프는 3개의 확인자(a, bar, b)를 포함한다

버블(3)은 bar의 스코프를 감싸고 있고, 해당 스코프는 하나의 확인자(c)만을 포함한다

성능

런타임에 스코프를 수정하거나 새로운 렉시컬 스코프를 만드는 방법으로 eval()과 with 모두 원래 작성된 렉시컬 스코프를 속인다

자바스크립트 엔진은 컴파일레이션 단계에서 상당수의 최적화 작업을 진행한다. 그러나 eval()과 with가 코드에 있다면 엔진은 미리 확인해둔 확인자의 위치가 틀릴 수도 있다고 가정해야한다

즉, eval()이나 with가 코드에 있다면 대다수 최적화가 의미 없어져서 아무런 최적화도 하지 않은 것이나 마찬가지가 되어 버린다

Last updated

Was this helpful?