[CS] JavaScript - Closure

ZenTechie·2023년 5월 9일
0

Javascript

목록 보기
2/5

Closure

Closure(클로저)두 개의 함수로 만들어진 환경으로 이루어진 특별한 객체의 한 종류이다.
여기서 환경은, 클로저가 생성될 때 그 범위에 있던 여러 지역 변수들이 포함된 context 를 의미한다.

클로저를 통해서 자바스크립트에는 없는 비공개(private) 속성/메소드, 공개(public) 속성/메소드를 구현할 수 있는 방안을 마련할 수 있다.

Closure 생성하는 방법

다음은 Closure(클로저)가 생성되는 조건이다.

  1. 내부 함수익명 함수로 되어 외부 함수의 반환값으로 사용된다.
  2. 내부 함수외부 함수의 실행 환경(execution environment)에서 실행된다.
  3. 내부 함수에서 사용되는 변수 x외부 함수변수 스코프에 있다.
function outer() {
  var name = `closure`;
  function inner() {
    console.log(name);
  }
  inner();
}
outer(); // closure

outer 함수를 실행시키는 context 에는 name 이라는 변수가 존재하지 않는다.

코드를 약간 변경해보자.

var name = `Warning`;
function outer() {
  var name = `closure`;
  return function inner() {
    console.log(name);
  };
}

var callFunc = outer();
callFunc(); // closure

위 코드에서 callFuncClosure(클로저)라고 한다.
callFunc 호출에 의해 name 이라는 값이 콘솔에 찍히는데, 찍히는 값은 Warning 이 아니라 closure 라는 값이다.
즉, outer 함수의 context속해있는 변수참조하는 것이다.
여기서 outer 함수의 지역변수로 존재하는 name 변수를 free variable(자유변수) 라고 한다.

잠깐!!!

스코프(=scope=context)는 함수를 호출할 때가 아니라 함수를 어디에 선언하였는지에 따라 결정된다. 이를 렉시컬 스코핑(Lexical scoping)라 한다.
위 예제의 함수 inner 는 함수 outer내부에서 선언되었기 때문에 함수 inner상위 스코프는 함수 outer 이다.
함수 inner전역에 선언되었다면 함수 inner상위 스코프전역 스코프가 된다.

이처럼 외부 함수 호출이 종료되더라도 외부 함수의 지역 변수 및 변수 스코프 객체의 체인 관계를 유지할 수 있는 구조Closure(클로저)라고 한다.
보다 정확히는 외부 함수에 의해 반환되는 내부 함수가리키는 말이다.

Clouser의 장점

데이터를 보존할 수 있다.

클로저 함수외부 함수의 실행이 끝나더라도 외부 함수 내 변수를 사용할 수 있다.
이처럼 클로저특정 데이터스코프 안에 가두어 둔 채계속 사용할 수 있게하는 폐쇄성을 갖는다.

정보의 접근 제한(캡슐화)

'클로저 모듈 패턴'을 사용해 객체에 담아 여러 개의 함수를 반환하도록 만든다.
이러한 정보의 접근을 제한하는 것캡슐화라고 한다.

모듈화에 유리하다.

클로저 함수를 각각의 변수에 할당하면 각자 독립적으로 값을 사용하고 보존할 수 있다.업로드중..

이처럼 함수의 재사용성을 극대화하여 하나의 함수를 독립적인 부품의 형태로 분리하는 것을 모듈화라고 한다.

클로저를 통해 데이터와 메소드를 묶어다닐 수 있기에 클로저는 모듈화에 유리하다.

profile
데브코스 진행 중.. ~ 2024.03

0개의 댓글