클로저(closure)

성민개발로그·2021년 10월 17일
1

자바스크립트

목록 보기
5/11
post-thumbnail

클로저(closure)란?

자바스크립트는 어휘적 환경을 갖습니다 (Lexical Environment).
클로저는 반환된 내부함수가 자신이 선언됐을 때의 렉시컬 환경을 기억하여 자신이 선언됐을때의 환경 밖에서 호출되어도 그 환경에 접근할 수 있는 함수를 말한다.


지금보인 코드들에 선언한 변수들이 다 렉시컬 환경에 저장이 됩니다.
처음에는 변수 let 은 선언은했지만 초기화가 안된상태입니다 아직은 사용할 수 없습니다. 하지만 함수선언문은 변수와 다르게 바로 사용을 할 수 있게 초기와 가 바로됩니다.
이제 let 을 만나서 초기화는 했지만 할당은 안해서 undefined 값을 가지고 있습니다.

세번째 라인부터 let이 할당이 됩니다 이제는 1이라는 값을 가지고있다.
마지막라인으로 갔을때는 addOne 함수가 실행이됩니다. 실행하는순간 새로운 lexical 환경이 생성이 됩니다.
이때 함수가 넘겨주는 매개변수(arguments)가 들어가 있는것을 확인 할 수 있습니다. 함수가 호출되는 동안 내부 렉시컬 환경과 외부 환경에서 받은 전역 렉시컬 환경 두개를 가지게됩니다 내부 렉시컬 함수는 외부 렉시컬 함수를 참조 할수 있게 됩니다. 이때 코드에서 변수를 찾을때 먼저 내부에서 찾고 없으면 외부 전역에서 변수를 찾는다 이렇게 범위를 넓혀가면서 탐색을 한다.그것을 스코프 체인을 통해서 찾는다고 합니다.
1.일단 addOne이 실행했을때 one 과 num 변수를 내부에서 찾습니다.
2.num은 찾았지만 one이 내부 렉시컬 환경에 없다는 것 을 알수있습니다 이때는 외주로 넓혀서 one 변수가 있는지 찾게됩니다.외부에서 찾아서 정상적으로 수행 할수 있게 됬습니다.

다른예>
최초 실행시 makeAdder 함수와 변수 add3 가 전역 렉시컬 환경에 저장이 됩니다.
다음으로 add3 이 선언될때 makeAdder 함수가 실행되고 makeAdder 렉시컬 환경이 생성이 됩니다.그러면서 x 가 선언이 됩니다.
마지막 줄에서는 makeAdder 함수안에있는 함수가 실행이 됩니다 그러면서 또 하나의
렉시컬 환경이 실행이 됩니다. 이떄 y가 2로 할당됩니다.
이제 x+y 를 해보면
1. 처음으로 익명함수 에서 x와y를 찾습니다 y는 찾았는데 x를 못 찾았습니다 이때는 참조중인 외부 렉시컬에서 x를 찾습니다. 찾으면 정상적으로 x+y를 수행할수 있습니다

클로저 활용:

  • 상태 유지:
    클로저가 가장 유용하게 사용되는 상황은 현재 상태를 기억하고 변경된 최신 상태를 유지하는 것이다.
  • 전역 변수 사용 억제:
    전역변수를 지역변수로 사용하여 어디서든 접근하지못하게 하기위해서 , 클로저를 사용해야 변경된 이전 상채를 기억하기 때문이다.
  • 정보의 은닉:

정리

closure:

  • 함수와 렉시컬 환경의 조합
  • 함수가 생성될 당시의 외부 환경을 기억한다
  • 생성 이후에 환경이 사라져도 계속 해당환경을 내부함수로 통해서 접근 가능하다.

0개의 댓글