클로저 개념정리 해보려고 한다.
프론트엔드 면접 질문으로 자주 등장하는 클로저
해당 개념을 좀 정리하는게 좋을것 같아 오늘은 이걸 정리해본다.
클로저(Closure)는 프로그래밍 언어에서 함수와 그 함수가 선언될 때의
렉시컬 환경(lexical environment)을 함께 저장한 개념을 말하는데
일단 참고를 위해서 함수를 이렇게 선언하고 실행시켜봤습니다
어떤식으로 흐름이 흘러가는지 보기위해
디버그 모드로 확인을 해봤다.
처음에는 클로저 부분에 아무값도 없지만
위 코드에서 외부함수가 호출되면, 외부변수가 정의된 환경이 생성되고
외부함수는 내부함수를 반환한다.
이 때 내부함수는 외부변수를 참조하는 클로저가 된다.
나의함수를 호출하면, 내부함수가 실행되고
이 함수는 자신이 정의될 때의 렉시컬 환경을 참조하여 외부변수에 접근할 수 있다
위 사진을 보면 클로저에 외부 변수값이 들어오는걸 확인 할 수 있다.
즉, 렉시컬 환경은 함수가 어디서 정의되었는지에 따라 결정되는 변수와 그 변수의 범위로,
함수가 호출될 때 어떤 변수에 접근할 수 있는지를 결정한다.
클로저는 이 렉시컬 환경을 기억하여 함수가 호출될 때 필요한 변수를 참조할 수 있게 한다
클로저의 주요 특징을 정리하자면
함수와 환경의 결합:
클로저는 함수와 그 함수가 정의될 때의 렉시컬 환경
(즉, 함수가 정의된 시점에서의 변수들을 포함)을 함께 저장한다.변수 은닉:
클로저를 사용하면 함수 외부에서 접근할 수 없는 비공개 변수를 만들 수 있다.
이는 정보 은닉(information hiding)이 가능하다.상태 유지:
클로저는 함수가 종료된 후에도 그 함수가 선언된 스코프 내의 변수들을 기억하여 상태를 유지할 수 있다.
상태유지를 확인해보기 위해 카운터를 만들어서 확인해봤습니다.
함수 내부의 변수값이 저장되어 사용되는걸 볼 수 있습니다.
이런식으로 코드를 짜서 테스트 해봤습니다.
외부에서 접근이 불가능하니 은닉이 되는 모습입니다.
렉시컬 환경은 함수가 정의될 때 결정되고,
실행 컨텍스트(execution context)가 생성될 때마다 렉시컬 환경이 함께 생성되서.
이를 통해 함수는 자신이 정의된 위치에 따라 어떤 변수에 접근할 수 있는지 결정된다는점.
스테픈2km완료