클로저
외부 함수의 변수(스코프)를 기억하고 있는 내부 함수
- 상태 유지를 위해 (count처럼), 비공개 변수처럼 활용 가능
- 함수 안에 함수를 정의하고 그 내부 함수를 반환하거나 사용할 때
function secretPassword() {
const password = "비밀123";
return function guess(input) {
return input === password ? "정답!" : "땡!";
};
}
const game = secretPassword();
console.log(game("hello")); // 땡!
console.log(game("비밀123")); // 정답!
password는 외부에서 접근할 수 없어.
하지만 클로저 덕분에 game 함수는 계속 그걸 기억하고 있음
🔁 정리 요약
- 클로저는 함수가 자기 주변 스코프를 "기억"하는 능력
- 외부 함수가 끝나도 변수는 내부 함수에 의해 계속 살아 있음.
- Promise든, 이벤트든, 비동기든 자주 쓰이는 이유는 "변수 기억력" 때문이다
정리 :
"함수 안에 변수를 만들고, 그걸 사용하는 내부 함수를 리턴해서, 바깥에서 그 내부 함수를 호출하는 구조"가 클로저다.
🔒 왜 중요한데?
- 외부에서는 못 보이게 (은닉) 하고
- 내부 함수는 계속 그 값에 접근 가능
- 즉, 변수를 기억하면서도 보호할 수 있음
🔍 기본 구조 예시
function outer() {
let count = 0; // 외부 변수
function inner() {
count++;
console.log(count);
}
return inner;
}
const fn = outer(); // outer 실행 → inner 함수가 return됨
fn(); // 1
fn(); // 2
fn(); // 3
🔎 이 코드에서 무슨 일이 벌어졌냐면…
- outer()가 실행되면, count는 0으로 만들어짐
- inner()는 count를 사용하는 함수고, outer의 지역 변수인 count를 참조함
- outer()는 끝났지만, inner가 count를 기억한 채 살아있음
- 그래서 fn()을 여러 번 실행할 때마다 count 값이 유지됨
이게 바로 클로저
함수가 끝났는데도, 그 함수 내부에 선언된 변수를 사용하고 있는 함수가 있어서 메모리에 남아있는 상태!
🧠 클로저의 핵심 포인트 요약
포인트설명
| ❗ 함수 안에 함수 | 내부 함수가 외부 변수 사용해야 클로저가 생김 |
| 💾 변수 기억 | 외부 함수가 끝나도, 내부 함수가 그 변수를 "기억" |
| 🧼 가비지 컬렉션 막음 | 참조하고 있으면 변수 안 사라짐 (메모리 관리 중요) |
✅ let vs var 완벽 비교
| 🔒 스코프 | 함수 스코프 | 블록 스코프 |
| 🕑 호이스팅 | 됨 (초기화는 안 됨, undefined) | 됨 (초기화 안 됨, 접근하면 에러) |
| 🔁 중복 선언 | 같은 스코프에서 가능 | 같은 스코프에서 불가능 |
| 💥 반복문에서 | 모든 반복에 대해 같은 변수 공유 | 반복마다 새 변수 생성 |
'중앙정보기술인재개발원 > HTML&CSS&JS' 카테고리의 다른 글
| [JS] | API , DOM, 요소 접근 (1) | 2025.04.24 |
|---|---|
| [JS] | 비동기, Promise,async,await (0) | 2025.04.23 |
| [JS] | 변수,연산자,조건문 (1) | 2025.04.21 |
| [HTML] | 기초정리, 태그, layout (0) | 2025.04.21 |
| [CSS] 클래스, 아이디, 우선순위 (0) | 2025.04.16 |