상위 스코프의 식별자를 참조하고, 중첩 함수가 외부함수의 생명주기보다 오래 살아남는 경우, 중첩함수를 클로저라고 한다.
💡 스코프?
정의된 변수를 사용할 수 있는 범위. 자바스크립트는 함수 스코프이다.
즉, 함수 안에 정의된 변수는 함수 안에서만 유효하고, 함수 외부에서는 유효하지 않음.
// 클로저 예시
function outer() { //외부 함수
const a = 1;
const b = 2;
return function inner() { //중첩 함수. 클로저
console.log(a); //외부함수(상위 스코프)의 식별자 참조
}
}
const bar = outer();
bar();
아래의 경우 inner 함수는 클로저가 아니다
// 상위 스코프의 어떤 식별자도 참조하지 않음
function outer() { //외부 함수
const a = 1;
const b = 2;
return function inner() { //중첩 함수.
const c = 3;
console.log(c);
}
}
const bar = outer();
bar();
// 상위 스코프의 식별자 참조하지만, 중첩함수가 반환되지 않음
// (외부 함수의 생명주기가 중첩함수보다 길 경우)
function outer() { //외부 함수
const a = 1;
const b = 2;
function inner() { //중첩 함수. 클로저였지만 outer보다 먼저 소멸
console.log(a);
}
inner();
}
outer();