
실행 컨택스트란 자바스크립트 코드가 실행되는 환경과 범위를 정의하는 개념.
코드에서는 전역 변수와 함수가 이루어져있고 함수안에는 또 지역변수가 존재한다면, 추후에 함수 호출을 할 경우 스코프와 식별자 그리고 코드 실행순서를 올바르게 유지할 수 있어야 합니다.
일종의 코드의 질서를 유지해주는것이 실행 컨택스트 입니다.
여기서 식별자와 스코프를 관리해주는것이 실행 컨택스트의 렉시컬 환경에서 관리하고
코드 실행 순서는 실행 컨택스트 스택으로 관리합니다.
먼저 실행 컨택스트 스택을 좀더 자세히 설명하면 현재 실행 중인 실행 컨택스트는 스택의 최상단에 위치하며 코드 실행이 종료가 된다면 해당 실행 컨택스트는 스택에서 제거됩니다.
렉시컬 환경에서는 대략 두가지 컴포넌트로 구성 된다고 할 수 있습니다.
첫번째로는 환경 레코드 컴포넌트 입니다. 환경 레코드에서는 식별자를 등록하고 등록된 식별자에 바인딩된 값을 관리하는 저장소 입니다.
우리가 늘 사용하던 this도 여기 환경 레코드 컴포넌트에 저장이 되는것 입니다.
ex) let x = 10; 에서 x라는 식별자를 등록이되고 10이라는 값을 바인딩 했다는 뜻.
두번째로는 외부 렉시컬 환경에대한 참조 컴포넌트 입니다.
해당 컴포넌트는 말그대로 참조로써 상위 스코프를 가리킵니다.
호이스팅 자체의 뜻 : 코드가 실행되기 전에 JavaScript 엔진이 변수 선언과 함수 선언을 미리 메모리에 할당하는 것
자바스크립트에서 함수나 코드 블록이 실행될 때, 이에 대한 실행 컨텍스트가 생성됩니다. 이 과정은 크게 두 단계로 나뉩니다. 코드의 평가와 실행 단계입니다.
평가 단계에서 실행 컨텍스트가 초기화되며, 이 과정에서 변수와 함수 선언이 환경 레코드에 등록됩니다.
이때 변수와 함수가 메모리에 미리 할당 되는데, 이 현상을 호이스팅이라고 합니다.
그런데 함수는 왜 선언문이 있는곳 전에 호출을 하면 실행이되고 변수는 에러가 나는걸까요?? (var 키워드는 undefined)
바로 함수는 코드평가시 함수 전체가 메모리에 할당되기 때문입니다. 그래서 함수 선언문 이전에 함수를 호출 할 수 있습니다.
반면에 변수는 let과 const는 평가단계에서 메모리에 등록은 되지만 초기화는 되지않으므로 초기화 이전에 참조하려고 하면 레퍼런스 오류가 발생하게 됩니다.
(var 키워드는 undefined으로 초기화까지 된다.)
클로저 자체의 뜻 : 함수와 함수가 선언된 렉시컬 환경을 함께 기억하여, 외부 함수의 생명 주기가 끝난 후에도 중첩 함수가 그 환경의 변수들을 참조할 수 있게 합니다.
그래서 이 클로저의 기능은 실행 컨택스트의 렉시컬 환경의 특성으로 인해 발생되는 것 입니다.
해당 클로저를 활용하여 정보은닉, 비동기처리등 을 유용하게 사용할 수 있습니다.