개발

클로저와 호이스팅에 대한 QA

Lee_hyojin 2022. 3. 31. 18:11

Q: 클로저가 무엇이며 장단점은 무엇인가?

 

A

A라는 함수가 있고 B라는 함수가 있다고 가정하고 A함수는 B함수 자체를 값으로 넘김으로써 B함수를 참조하는 함수 객체 자체를 반환합니다. B함수는 함수가 선언된 Lexical Environment 밖에서 실행 됐고 B함수가 선언된 위치 때문에 A함수의 Environment에 대한 Lexical Environment 클로저를 가지고, A함수는 B함수가 나중에도 참조할 수 있도록 Environment를 살려두어서 B함수가 계속 참조를 가지게 되는데 이 참조를 클로저라고 부릅니다.

 

예를들어 A를 실행하여 변수 C에 할당했는데 다른 코드를 실행하다가 어느 순간 C를 또 실행해야 하면 A는 B가 리턴되려면 C를 실행해야하기 때문에 GC에 의해 사라지면 안되는 것입니다.

 

** 장점 **

  • 전역 변수의 남용을 막을 수 있고 (잦은 함수 호출로 인한 퍼포먼스 손해 등등) 변수 값을 은닉(캡슐화)할 수 있다.
  • 특정 데이터를 스코프 안에 가두어 둔 채로 계속 사용할 수 있게하는 폐쇄성을 이용하여 데이터를 보존할 수 있다.
  • 클로저 함수를 각각의 변수에 할당하면 각자 독립적으로 값을 사용하고 보존할 수 있기 때문에 재사용성에 좋고, 함수 하나를 독립적인 부품의 형태로 분리할 수 있다. (모듈화)

** 단점 **

  • 메모리를 소모한다. 특정 데이터를 계속 사용할 수 있는 장점이 단점이 될 수도 있다. 메모리의 소모는 리턴하거나 타이머, 콜백 등으로 위에 있는 코드처럼 등록했던 함수들이 메모리에 계속 남아있게 되면 해당하는 클로저도 같이 메모리에 계속 남아있기 때문에 지속적으로 루프를 돌면서 클로저를 생성한다.
  • environment(scope) 생성에 따른 퍼포먼스 손해가 있다. 클로저는 하나의 새로운 environment(scope)를 생성하여 내부의 함수에 링크 시키기 때문에 이에 따른 퍼포먼스 손해도 감수해야한다. 즉, 자신이 선언될 당시의 환경을 기억하는 함수이기 때문에 퍼포먼스 저하가 있을 수 있다.

 


 

Q:  호이스팅이 무엇인가?

 

A

함수와 변수가 코드를 실행하기 전에 실행컨텍스트를 위해서 메모리에 저장되는 것을 호이스팅이라고 합니다.

함수같은 경우는 전체 함수에 대한 참조와 함께 저장되고 var키워드가 있는 변수는 undefined, let과 const는 초기화되지 않은 상태로 메모리에 저장됩니다.

단지, 실행 전에 어떠한 과정을 거쳐서 변수와 함수에 대한 전체적인 정보를 미리 알고있을 뿐인 것 같아요.
함수와 변수가 다른 것은 선언된 함수와 var는 상단에서 참조, 호출이 가능하고, 선언된 let, const는 불가능하다는 것입니다.

함수 호이스팅은 가장 먼저 이루어지는데, 이 함수 호이스팅은 선언문에만 해당됩니다. 그래서 표현식은 결국 어떠한 변수에 함수를 할당하는 것이라서 변수 호이스팅으로 봅니다.