Javascript
자바스크립트 렉시컬 스코프
규몽
2020. 11. 20. 22:45
스코프는 두 가지 방식으로 작동하는데 그 중 하나를 '렉시컬 스코프'라고 부른다.
렉시컬 스코프란 개발자가 코드를 작성할 때 함수를 어디에 선언하는지에 따라 정의되는 스코프를 말한다.
렉시컬 스코프는 함수를 어디서 호출하는지가 아니라 어디에 선언하였는지에 따라 결정된다.
컴파일러는 첫 단계를 전통적으로 토크나이징 또는 렉싱이라 불리는 작업으로 시작하는데 렉싱 단계에서는 모든 확인자가 어디서 어떻게 선언됐는지 파악하여 실행 단계에서 어떻게 확인자를 검색할지 예상할 수 있도록 도와준다.
렉시컬 스코프를 속이는 두 가지 방식이 있는데 eval( )과 with다.
eval( )은 하나 이상의 선언문을 포함하는 코드 문자열을 해석하여 렉시컬 스코프가 있다면 런타임에 이를 수정한다.
with는 객체 참조를 하나의 스코프로, 속성을 확인자로 간주하여 런타임에 완전히 새로운 렉시컬 스코프를 생성한다.
성능 문제
eval( )과 with가 코드에 있다면 엔진은 미리 확인해둔 확인자의 위치가 틀릴 수도 있다고 가정해야 한다.
엔진은 렉싱 타임일 때 eval( )에 어떤 코드가 전달되어 렉시컬 스코프가 수정될지 정확하게 알 수 없고,
with에 넘긴 객체의 내용에 따라 새로운 렉시컬 스코프가 생성될 수 있기 때문이다.
즉 eval( )이나 with가 코드에 있다면 대다수 최적화가 의미 없어져서 아무런 최적화도 하지 않은 것이나 마찬가지다.
이는 최적화를 못하기 때문에 속도 저하를 준다.