본문 바로가기

TIL

<자바스크립트 Javascript> let 키워드 (2) (+ 클로저)

- 클로저의 사용

for 반복문의 초기화 식에 사용된 변수에 var 키워드를 적용하면, 이것이 전역 스코프가 되어 의도와 다른 결과를 출력하게 된다. 이를 해결하기 위해 클로저를 사용할 수 있다. 하지만 var 키워드 대신 let 키워드를 사용하면, 클로저를 사용하지 않고도 의도한 결과 출력이 가능하다. for 반복문의 초기화 식에서 let 키워드로 선언한 변수는 지역 변수로서 작용하게 되기 때문이다.

 

 

*클로저(closure)란?

클로저는 자바스크립트 고유의 개념은 아니다. 함수를 일급 객체로 취급하는 함수형 프로그래밍 언어에서 중요하게 다뤄지는 특징이다. 예로, 외부함수 내에 내부함수를 선언하였을 때에 내부함수는 외부함수에 포함되는 관계를 갖는다. 따라서 보통의 경우 외부함수가 종료되면 내부함수 역시 실행이 불가하나 외부함수보다 내부함수가 더 오래 유지되는 경우가 존재한다. 따라서 외부함수 밖에서 내부함수를 호출했을 때에 외부함수의 지역 변수에 접근이 가능하게 된다. 이 때의 함수가 바로 클로저인 것이다. 즉, 클로저는 반환된 내부함수가 자신이 선언되었을 때의 환경인 렉시컬 환경을 기억하여 자신이 선언되었을 때의 환경 밖에서 호출되어도 그 환경에 접근할 수 있는 함수를 뜻한다. 좀 더 간단하게는 클로저란 자신이 생성되었을 때의 환경인 렉시컬 환경을 기억하는 함수인 것이다. 따라서 클로저에 의해 참조되어지는 외부함수의 변수는 자유변수(free variable)이라 칭한다.

 

또한 실행 컨텍스트의 관점에서는 외부함수 실행 컨텍스트 내의 활성 객체(Activation object)가 내부함수에 의해 참조되어지고 있는 한 유효하기 때문에 내부함수가 스코프 체인을 통해 참조할 수 있다는 것으로 설명된다. 이 때, 내부함수는 외부함수 변수의 복사본이 아니라 실제 변수에 접근한다.

 

클로저가 유용하게 사용될 수 있는 상황으로는 다음과 같은 것들이 있다.

1) 상태 유지 - 현재 상태를 기억하고, 변경된 최신 상태를 유지해야 할 때 유용하게 사용될 수 있다.

2) 전역 변수의 사용 억제 - 전역변수를 지역변수로 변경하는 등 전역 변수의 의도치 않은 상태 변경을 억제하는 것이 가능하지만, 한계가 따른다. 따라서 변경된 이전 상태를 기억하면서도 의도치 않은 상태 변경을 걱정할 필요가 없는 클로저가 이러한 상황에서 유용하게 사용될 수 있다.

3) 정보의 은닉 - 기억할 수 있다는 클로저의 특징 때문에, 클래스 기반 언어의 private 키워드를 흉내내는 것이 가능해진다.

 

 

- 전역 객체와 let

var 키워드로 선언된 변수는 전역 변수로 사용 시 전역 객체의 프로퍼티가 되지만, let 키워드로 선언된 변수는 전역 변수로 사용 시 전역 객체의 프로퍼티로 사용할 수 없다. let 전역 변수는 보이지 않는 개념적인 블록 내에 존재한다.

 

 

 

 

 

참고 : poiemaweb 웹사이트