INTRO
개발을 진행하면서, 모호했던 javascript의 개념들을
다시 한번 정리하기 위한 포스팅이다.
자바스크립트의 렉시컬 환경(Lexical Environment)에 대해서 알아본다.
0. 서론
- 이전 포스팅에서 실행 컨텍스트에 대해 정리했는데, 해당 글을 보면 실행 컨텍스트의 구성 요소 중 렉시컬 환경이 있었다.
- 렉시컬 환경이 뭘까?
2023.01.10 - [Dev/[Javascript]] - [javascript] 실행 컨텍스트(Execution Context)
[javascript] 실행 컨텍스트(Execution Context)
INTRO 개발을 진행하면서, 모호했던 javascript의 개념들을 다시 한번 정리하기 위한 포스팅이다. 자바스크립트의 실행 컨텍스트(Execution Context)에 대해서 알아본다. 0. 서론 - 실행 컨텍스트는 직역하
rangsub.tistory.com
- Lexical을 직역하면 '어휘'
- 우리말로 어휘란 어떤 특정한 범위 내에서 사용되는 낱말의 총 집합을 뜻한다.
- 우리말의 의미와 100% 매칭되진 않지만 얼추 비슷해 보이므로, 이 의미로 감을 먼저 잡으면 될 것 같다.
- 자바스크립트의 코드가 동작하기 위해선 다양한 정보가 필요하다.
- 간략한 예를 아래에 들자면, func() 함수 내 a+b를 계산하기 위해서는,
- 전역으로 선언되어있는 a 에 대한 정보를 함수 내부에서 알고 있어야한다.
let a = 10;
function func() {
console.log(a);
let b = 30;
let c = a + b;
console.log(c);
}
func();
- 어떻게 알 수 있을까?
('전역으로 선언되어있으니까~' 라며 항상 당연하다고만 생각하고 넘어갔었다.)
- 그것은 func()함수의 렉시컬 환경에, a를 참조할 수 있는 정보가 들어있기 때문이다.
- 즉 렉시컬 환경이란,
- 특정한 범위 내에서, 코드를 실행하기 위해 사용되는 정보의 총 집합
- 을 가진 환경 이라고 생각하면 될 것 같다.
- 여기서 '범위(스코프)' 는 자바스크립트 뿐만 아니라 다른 언어에서도 통상적으로 있는 아주 중요한 개념인데,
- 아래 글을 보고 이 스코프 개념을 먼저 정리하고 넘어가보자.
2023.01.16 - [Dev/[Javascript]] - [javascript] 스코프(Scope)
1. 렉시컬 환경은 무엇인가?
- 렉시컬 환경은 스코프와 스코프 체인, 스코프 내부에 선언된 함수나 변수, 인자로 받은 정보등을 전부 포함하고 있는 하나의 환경이다.
- 그러므로 스코프의 상위 개념이 된다.
- 이 렉시컬 환경은 이전 포스팅에서 설명한 실행 컨텍스트의 구성 요소이다.
- 실행 컨텍스트는 호출 스택에 하나씩 Push되고 Pop되면서 실행되는 특성이 있는데,
- 실행될 때 다른 실행 컨텍스트 내 렉시컬 환경을 참조하면서 관계나 범위를 정해주는 역할을 한다.
- Key : Value 형태로 정보를 모두 가지고있는 하나의 객체로 봐도 무방하다(다만 코드를 짜면서 우리가 이 객체를 조회하거나 수정할 수는 없다)
2. 렉시컬 환경의 구성 요소
- 렉시컬 환경은 환경 기록(Environment Records) 와 외부 렉시컬 환경에 대한 참조(Outer Reference Environment) 로 구성되는데
- 환경 기록(Environment Records)에는 로컬 변수에 대한 정보들을 저장하고 있고,
- 외부 렉시컬 환경에 대한 참조(Outer Reference Environment)에는 상위 렉시컬 환경에 대한 정보가 저장되어 있다.
- (정확히 말하면 상위 렉시컬 환경의 주소가 저장되어 있고 이 주소를 참조하여 상위 렉시컬 환경의 정보에 접근하는 것을 스코프 체인이라고 한다.)
마무리
렉시컬 환경은 실행 컨텍스트의 구성요소로써 논리적으로 구분된 환경이며, 실행 컨텍스트 > 렉시컬 환경 > 스코프 순으로, 개념적으로 포함한다고 봐도 무방해보인다.(틀렸다면 댓글로 알려주시면 감사하겠습니다.)
-퍼가실 때는 출처를 꼭 같이 적어서 올려주세요!
'Dev > [Javascript]' 카테고리의 다른 글
[Javascript] Module과 Module 시스템에 대해서(feat. CommonJS, ES6) (0) | 2023.03.13 |
---|---|
[Javascript] XMLHttpRequest와 Ajax에 대한 이야기 (0) | 2023.03.08 |
[javascript] 스코프(Scope) (0) | 2023.01.16 |
[javascript] 실행 컨텍스트(Execution Context) (1) | 2023.01.10 |
[javascript] ES6 - 화살표 함수(Arrow function) (0) | 2023.01.07 |