식별자가 본인이 선언된 위치에 따라 다른 코드에서 자신이 참조될 수 있을지 없을지 결정되는 것
var x = '전역 x';
function outer() {
var y = 'outer 지역 y';
console.log(x); // 전역 x
console.log(y); // outer 지역 y
function inner() {
var x = 'inner 지역 x';
console.log(x); // inner 지역 x
console.log(y); // outer 지역 y
}
inner();
}
outer();
console.log(x);
console.log(y);
스코프가 계층적으로 연결되어 있는 것

if (true) {
let letVal = 'let';
var varVal = 'val';
}
// letVal;
varVal // val
const x = 1;
function outer() {
const x = 10;
const inner = function() {
console.log(x);
}
return inner;
}
const ella = outer(); // outer의 생명 주기 마감
ella(); // outer의 지역 변수 10 출력
위와 같이 생명 주기를 마감한 외부 함수 outer의 지역 변수 x를 참조할 수 있는 inner와 같은 함수를 클로져라고 한다. 즉, 중첩 함수에서 상위 스코프의 식별자를 참조하고 있고 외부 함수보다 더 오래 살아있다면 클로저이다. 그리고 const x = 10; 을 자유 변수라고 한다.
중첩함수 🤓
위 코드에서 outer()는 외부함수, inner()는 중첩함수이다.
| outer 함수 실행 | ![]() |
| outer 함수 종료 | ![]() |
outer 함수는 콜 스택에서 완전히 제거 되었지만 outer의 렉시컬 환경까지 제거되지는 않는다. 내부 슬롯에 저장된 상위 스코프에 의존하여 상위 스코프 내 식별자를 참조할 수 있게 된다.