자바스크립트 클로저 이해: 포괄적인 가이드
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
웹 개발
대상자
- 대상자: 중급 이상의 자바스크립트 개발자
- 난이도: 중간 (lexical scoping, 함수 클로저, 비동기 처리 등 핵심 개념 이해 필요)
핵심 요약
- 클로저 정의: 함수와 해당 함수가 선언된 lexical environment의 조합으로, 외부 스코프의 변수에 접근 가능
- 주요 활용:
- 데이터 캡슐화:
let count = 0
과 같은 private variable 생성 가능 (counter()
예시) - 함수 팩토리:
multiplier(factor)
와 같은 함수 생성자 구현 가능 - 비동기 처리:
setTimeout
과 같은 이벤트 핸들러에서 외부 스코프 변수 유지 가능 - 주의사항:
var
대신let
사용 (루프 내 클로저 생성 시i
값 누수 방지)
섹션별 세부 요약
1. 클로저의 정의와 원리
- Lexical Environment: 함수가 선언된 위치(스코프)에 기반한 정적 스코핑
- Inner/Outer Function: 외부 함수가 실행된 후에도 내부 함수가 외부 변수에 접근 가능 (예:
outerFunction
→innerFunction
) - 클로저의 구성: 함수 + 외부 스코프의 변수 참조 (예:
myFunc
은outerVar
값을 유지)
2. 클로저의 활용 사례
- 데이터 캡슐화:
counter()
함수 내count
변수는 외부에서 직접 접근 불가increment()
,decrement()
,getValue()
메서드를 통해 제어 가능- 함수 팩토리:
multiplier(factor)
함수가x * factor
계산하는 고정된 매개변수를 가진 함수 반환double = multiplier(2)
,triple = multiplier(3)
예시- 이벤트 핸들러:
setTimeout
에서name
변수를 유지하여delayedGreeting("Alice", 1000)
실행 시 "Hello, Alice!" 출력
3. 클로저의 주의사항과 해결책
var
사용 시 문제:- 루프 내
var i
로 선언 시 모든 버튼이i = 5
값을 공유 - 예:
createButtons()
실행 시 모든 버튼이 "Button 5 clicked!" 출력 - 해결 방법:
let
사용 (루프 내let i
로 새 스코프 생성)- IIFE 사용 (즉시 실행 함수 표현식으로 스코프 분리)
- 예:
createButtonsCorrected()
에서let i
사용 시 각 버튼이i = 0~4
정확히 유지
4. 클로저의 중요성과 실무 적용
- 핵심 역할:
- 데이터 보호 (private variable 생성)
- 재사용 가능한 함수 생성 (함수 팩토리)
- 비동기 처리 시 외부 스코프 변수 유지 (이벤트, Promise 등)
- 실무 팁:
let
사용으로 스코프 누수 방지- 클로저 기반 모듈 패턴 활용 (예:
counter()
객체 리턴) - 비동기 작업에서
this
참조 주의 (화살표 함수 사용 권장)
결론
- 핵심 팁: 클로저는
let
사용, 함수 팩토리, 데이터 캡슐화에 필수적.var
대신let
을 사용하여 루프 내 스코프 누수를 방지하고,IIFE
나 화살표 함수로this
참조 문제 해결. 클로저를 통해 더 안정적이고 모듈화된 자바스크립트 코드 작성 가능.