본문 바로가기

Javascript

클로저

클로저

  • 상태가 의도치 않게 변경되지 않도록 상태를 안전하게 은닉하고, 특정 함수에게만 상태 변경을 허용하기 위해 사용
  • 외부 변수를 기억하고 이 외부 변수에 접근할 수 있는 함수
  • 외부 함수 보다 중첩 함수가 더 오래 유지되는 경우, 중첩 함수는 이미 생명 주기가 종료한 외부 함수의 변수를 참조할 수 있음
  • 중첩 함수가 상위 스코프의 식별자를 참조하고 있고 중첩 함수가 외부 함수보다 더 오래 유지되는 경우
  • 이러한 중첩 함수 => 클로저
  • 자바스크립트의 모든 함수는 상위 스코프를 기억하므로 이론적으로 모든 함수는 클로저. 하지만, 상위 스코프의 어떤 식별자도 참조하지 않는 함수는 클로저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;
}());

즉시 실행 함수를 사용하는 이유

  1. 전역 변수 사용을 억제하기 위해
    1. 모든 코드를 즉시 실행 함수로 감싸면 모든 변수는 즉시 실행 함수의 지역 변수가 됨
    2. 변수의 충돌을 피할 수 있음
  2. 정보 은닉을 위해
    1. 즉시 실행 함수는 클로저를 만들때 사용
  3. 렉시컬 환경을 공유하는 클로저를 만들기 위해

'Javascript' 카테고리의 다른 글

프로토타입  (0) 2023.02.16
실행 컨텍스트  (0) 2023.01.06
스코프  (0) 2023.01.06
렉시컬 환경  (0) 2023.01.06
블록레벨스코프와 함수레벨스코프  (0) 2022.07.27