-
JavaScript Closure개발언어/JavaScript 2022. 4. 3. 13:43
JavaScript자체는 함수를 정의하지 않고, 함수를 객체로 만들어서 함수가 정의된 것으로 여긴다. 또 함수를 객체로 만들기 때문에 그 함수 객체가 반환 될 수도 있고, 함수가 함수 안에서 만들어 질 수도 있고, 그러다 보니까 함수가 가진 지역변수에 대한 문제가 클로저라 것의 필요성을 발생시켰다.
변수 생명주기와 클로저(Closure)
함수가 하나 정의되어 있고 var라는 키워드를 사용해서 a를 선언했기 때문에 a는 함수 안에서만 사용할 수 있는 지역변수 이다. 누군가 f1()을 호출하게 되고, 그 값을 반환 받게 되면, 당연히 1이 반환되게 된다. 함수안에서 선언되었던 a라는 변수는 함수안에서 생명주기를 살아있게된다. 그리고 f1()함수가 가지고 있던 자원들은 모두 해지된다.
JavaScript는 함수가 함수를 포함 할 수 있다. 그래서 다음 설명과 같은 경우가 발생할 수 있다. 그림2의 f1()도 그림1의 f1()과 똑같이 a라는 지역변수를 가지고 있다.
그런데 공교롭게도 f1()을 호출해서 반환 받는 결과가 그림2에서는 함수객체이다. 그러므로 변수f는 결과로 함수 객체를 받게된다. 그래서 변수f는 함수를 나타내는 이름이 된다. 그래서 변수f를 함수처럼 사용할 수 있게 된다.
그래서 var a = f();로 변수f를 함수로 사용한다는 것은 f1( )함수의 결과로 반환 받았던 f2( )함수를 의미한다. f( )가 함수로 호출되게 되서 반환 받는 값은 f2()의 return 값인 a값이다. 그런데 a의 값을 받으려고 했더니, a가 f2( )함수만 가지고 있었던 자신만의 변수가 아니라, 자신을 결과 값으로 반환한 f1( )함수의 지역변수이다.
여기서 문제가 발생한다. f1( )은 반환 값으로 f2( ) 함수객체를 반환한 순간 모든 자원이 해제되야 한다. 그런데 f2( )함수에서 자신의 자원 a를 사용하고 있기 때문에 f1( )함수는 자원을 해제 할 수가 없다. 그래서 JavaScritp는 f1( )의 자원을 해제하지 않는다.
오로지 f1( )함수의 지역변수 a의 자원이 해제될 수 있는 방법은 반환 함수객체인 f2()가 변수 f에 의해 참조되는 것이 사라지는 것 뿐이다.
그래서 함수 f2( )를 함수 f1( )이 가진 자원을 닫을수 있는 유일한 key라고 해서 closure라고 한다.
이런 closure라는 것에 의해서 자원이 계속해서 묶이는 일이 발생할 수 있는데, 자원이 묶이는 것을 알고 묶는 것과 모르고 묶는 것은 다르다. closure가 발생하지 않도록 프로그램을 잘 만들어야 하거나, 의도적으로 closure를 만들 수도 있다.
★Tip
함수안에서 함수를 정의할 경우에 그 액자형식으로 정의된 함수가 지역변수를 가지고 있지 않은 상태에서는 자신보다 상위에 정의 된 함수의 지역변수를 사용할 수 있다.'개발언어 > JavaScript' 카테고리의 다른 글
Promise 개념부터 활용 (0) 2022.06.09 비동기 처리의 시작 Callback 이해하기 (0) 2022.06.08 Eval함수로 JSON파싱 하기 (0) 2022.04.03 JavaScript의 JSON (0) 2022.04.02 JavaScript의 Object 객체 (0) 2022.04.02