클로저
- 상태가 의도치 않게 변경되지 않도록 상태를 안전하게 은닉하고, 특정 함수에게만 상태 변경을 허용하기 위해 사용
- 외부 변수를 기억하고 이 외부 변수에 접근할 수 있는 함수
- 외부 함수 보다 중첩 함수가 더 오래 유지되는 경우, 중첩 함수는 이미 생명 주기가 종료한 외부 함수의 변수를 참조할 수 있음
- 중첩 함수가 상위 스코프의 식별자를 참조하고 있고 중첩 함수가 외부 함수보다 더 오래 유지되는 경우
- 이러한 중첩 함수 => 클로저
- 자바스크립트의 모든 함수는 상위 스코프를 기억하므로 이론적으로 모든 함수는 클로저. 하지만, 상위 스코프의 어떤 식별자도 참조하지 않는 함수는 클로저X
- 상태를 안전하게 변경하고, 유지하기 위해 사용
- 자바스크립트의 함수는 숨김 프로퍼티인 [[Environment]]를 이용해 자신이 어디서 만들어졌는지를 기억
- 함수 본문에선 [[Environment]]를 사용해 외부 변수에 접근
클로저의 정의
- 외부 변수를 기억하고 이 외부 변수에 접근할 수 있는 함수
자바스크립트에서 왜 모든 함수가 클로저 인지?
- 자바스크립트의 모든 함수는 상위 스코프를 기억하므로 이론적으로 모든 함수는 클로저. 하지만, 상위 스코프의 어떤 식별자도 참조하지 않는 함수는 클로저X
즉시 실행 함수
- 함수 정의와 동시에 즉시 호출되는 함수
- 단 한 번만 호출되며 다시 호출할 수 없음
- 함수 이름이 없는 익명 함수를 사용하는 것이 일반적
// 익명 즉시 실행 함수
(function () {
var a = 3;
var b = 5;
return a * b;
}());
// 기명 즉시 실행 함수
(function foo() {
var a = 3;
var b = 5;
return a * b;
}());
즉시 실행 함수를 사용하는 이유
- 전역 변수 사용을 억제하기 위해
- 모든 코드를 즉시 실행 함수로 감싸면 모든 변수는 즉시 실행 함수의 지역 변수가 됨
- 변수의 충돌을 피할 수 있음
- 정보 은닉을 위해
- 즉시 실행 함수는 클로저를 만들때 사용
- 렉시컬 환경을 공유하는 클로저를 만들기 위해
'Javascript' 카테고리의 다른 글
프로토타입 (0) | 2023.02.16 |
---|---|
실행 컨텍스트 (0) | 2023.01.06 |
스코프 (0) | 2023.01.06 |
렉시컬 환경 (0) | 2023.01.06 |
블록레벨스코프와 함수레벨스코프 (0) | 2022.07.27 |