Javascript에서 변수와 함수의 생명주기는 실행 컨텍스트와 렉시컬 환경에 의해 관리됩니다.
변수가 실행 컨텍스트의 렉시컬 환경에 등록. 이 단계는 코드 실행 전 엔진의 준비 과정에서 발생
변수에 메모리가 할당됨. var로 선연된 변수는 자동으로 undefined로 초기화되지만, let과 const는 이 단계가 선언과 분리되어 TDZ가 발생합니다.
변수에 실제 값 할당
변수가 접근 불가능해지고 가비지 컬렉션의 대상이 됨
var로 선언된 변수는 함수 스코프를 가지며 호이스팅 시 초기화까지 자동으로 이루어집니다. 그러나 let과 const는 블록 스코프를 가지며 선언 위치까지 접근이 제한됩니다.
함수 선언문의 경우 완전히 호이스팅되어 선언 전에도 호출 가능하지만, 함수 표현식은 변수의 생명주기를 따릅니다.
실행 컨텍스트가 콜 스택에서 제거되면 해당 컨텍스트의 변수들은 접근 불가능해지지만, 클로저가 형성된 경우 외부 함수의 변수들은 내부 함수가 존재하는 한 계속 유지됩니다.
함수 선언문과 함수 표현식은 js에서 함수를 정의하는 두 가지 주요 방식입니다.
function sayHello(){
return '안녕하세요';
}
const sayHello = function(){
return '안녕하세요';
};
// 화살표 함수도 함수 표현식
const sayHi = () => '안녕';