728x90
렉시컬 스코프란?
개발자가 코드를 작성할 때 함수를 어디에 선언하는지에 따라 정의되는 스코프
컴파일레이션의 렉싱단계에서 모든 확인자가 선언된 위치를 파악해
실행 단계에서 어떤 확인자를 검색할지 예상할 수 있도록 도와준다.
const foo = (a) => {
var b = a * 2;
const bar = (c) => {
console.log(a, b, c);
}
bar(b * 3);
}
foo(2); // 2, 4, 12
위의 코드에는 3개의 중첩 스코프가 있다.
- 글로벌 스코프이며, 해당 스코프 안에는 하나의 확인자(foo)만 있다.
- foo의 스코프이며, 해당 스코프는 3개의 확인자(a, bar, b)가 있다.
- bar의 스코프이며, 해당 스코프는 하나의 스코프(c)만 있다.
검색
엔진은 스코프 버블의 구조와 상대적 위치를 통해 어디를 검색해야 확인자를 찾을 수 있는지 안다.
검색은 가장 안쪽의 스코프 버블 스코프 부터 시작한다.
여기서 찾지 못하면 가장 가까운 스코프 버블로 한단계 올라가고, Lexical Environment의 outer가 null 이되도 찾지 못하면 에러를 발생시킨다.(참고 정리글)
스코프는 목표와 일치하는 대상을 찾는 즉시 검색을 중단한다.
여러 중첨 스코프 층에 결쳐 같은 확인자 이름을 정의하는 것을 섀도잉이라 불린다.
(더 안쪽의 확인자가 더 바깥쪽의 확인자를 가리는 것)
렉시컬 스코프를 속이는 방법 2가지
1. eval()
하나 이상의 선언문을 포함하는 코드 문자열을 해석해서 렉시컬 스코프가 있다면 런타임에 이를 수정한다.
2. with
객체 참조를 하나의 스코프로, 속성을 확인자로 간주해 런타임에 완전히 새로운 렉시컬 스코프를 생성한다.
하지만, eval()과 with를 사용하게 되면 JS엔진의 최적화 작업을 무효화 한다고
생각해야 하기에 사용하게 되면 코드를 더욱 느리게 만든다.
728x90
'JavaScript > You Don't know JS' 카테고리의 다른 글
I don't know JS YET) 함수 vs 블록 스코프 - 2 (0) | 2022.12.23 |
---|---|
I don't know JS YET) 함수 vs 블록 스코프 - 1 (1) | 2022.12.21 |
I don't know JS YET) 스코프란 무엇인가 (0) | 2022.12.15 |
JS 복습 1주차 / 4. 강제 변환 Coercion (0) | 2022.11.07 |
JS 복습 1주차 / 3. 네이티브 (0) | 2022.11.07 |