[JS] 클로저

강원지·2023년 5월 5일
0

클로저

"클로저는 함수와 그 함수가 선언된 렉시컬 환경의 조합이다."

처음 이 설명을 봤을 때 계속해서 다시 읽어보았던 것 같다. 설명이 참 난해하다. 이제부터 하나하나 뜯어보겠다.

렉시컬 환경

식별자, 식별자에 바인딩된 값, 상위스코프에 대한 참조를 기록하는 자료구조. 실행 컨텍스트를 구성하는 컴포넌트!

실행 컨텍스트

해당 코드의 실행 환경(스코프와 코드 실행 순서 관리)를 구현한 메커니즘.

실행 컨텍스트는 현재 실행되고 있는 코드의 컨텍스트로, 변수나 함수 등의 식별자를 해석하고 실행할 때 필요한 정보를 담고 있다.

실행 컨텍스트는 스택 형태로 관리되며, 새로운 함수가 호출될 때마다 새로운 실행 컨텍스트가 생성되어 스택에 추가된다.

그래서 클로저란?

외부 함수가 실행 되고 반환된 후에도 ‘외부 함수의 내부에 있는 함수’에 체이닝을 할 수 있는 함수이다.

    function outer() {
      var name = "Mozilla";
      function inner() {
        alert(name);
      }
      return inner;
    }

    var myFunc = outer();
    myFunc();//alert!

outer 함수를 호출하면 outer 함수는 inner 함수 반환하고 실행 컨텍스트 스택에서 제거되어 생명주기를 마감한다.
그러나 myFunc를 호출하면 outer 함수 내부의 inner 함수가 동작한다.

가능한 이유

외부 함수의 렉시컬 환경은 내부 함수의 [[ Environment ]] 내부 슬롯에 의해 참조되고 내부 함수는 클로저로 선언한 전역변수에 의해 참조되고 있으므로 가바지 컬렉션의 대상이 되지 않지 않기 때문이다.

함수와 그 함수가 선언된 렉시컬 환경의 조합?

위 말을 다시 이해해보자면

"클로저란 함수와 함수의 상위 스코프를 의미하는 실행 컨텍스트의 렉시컬 환경과의 조합"

을 의미한다.

내가 이해한 바로 더 쉽게 풀어쓰자면 함수와 함수 상위 스코프에서의 실행 환경을 조합을 통해 함수가 종료된 후에도 해당 함수의 변수나 함수를 계속 사용할 수 있게 해주는 개념이다.

정보 은닉

클로저를 사용하면 함수 내부에서 선언한 변수를 외부에서 접근할 수 없기 때문에 상태를 안전하게 변경 또는 유지할 수 있다.

참고

자바스크립트 Deep Drive
mdn 클로저

0개의 댓글