
자바스크립트에서 함수가 선언된 어휘적 환경을 기억하고 접근할 수 있는 기능을 클로저라고 한다. 클로저는 함수가 생성될 때의 스코프와 그 내부 변수들에 대한 참조를 유지한다.
자바스크립트에서 클로저는 함수 생성 시 함수가 생성될 때마다 생성된다.
클로저라는 이름은 수학과 람다 계산법에서 유래했다. 람다 계산법에서 클로저는 함수와 그 함수가 선언된 환경의 조합을 나타낸다. 이 개념이 프로그래밍 언어에 도입되면서, 함수와 그 함수가 선언된 어휘적 환경(lexical environment)을 함께 캡슐화(closing over)하는 특성을 지닌다는 의미에서 클로저(closure)라고 부르게 되었다.
클로저는 함수가 생성될 때의 환경을 "닫아" 둔다고 해서 붙여진 이름이다. 함수가 생성된 시점의 환경을 기억하고, 그 환경 내의 변수들에 접근할 수 있도록 하는 것이 클로저의 핵심이다.
자바스크립트에서는 합수 내부의 변수를 외부에서 접근할 수 없도록 보호해야 할 때가 있는데, 일반적인 함수 호출로는 이를 구현하기 어렵다. 예를 들어서, 어떤 값이 외부에 노출되지 않으면서도 그 값을 조작할 수 있는 방법이 필요할 때가 있다.
closure를 사용해서 문제를 해결해보자.
클로저기법 사용하여 함수 내부에서 변수를 선언하고, 그 변수를 조작하는 함수를 반환함으로써 외부에서 접근할 수 없게 한다.
function createCounter() { let count = 0; // 외부에서 접근할 수 없는 변수 return { increment: function() { count++; return count; }, decrement: function() { count--; return count; }, getCount: function() { return count; } }; } const counter = createCounter(); console.log(counter.increment()); // 1 console.log(counter.getCount()); // 1여기서 count 변수는 createCounter 함수 외부에서는 접근할 수 없으며, 반환된 객체의 메서드를 통해서만 조작할 수 있다.
함수가 호출될 때마다 새로운 변수를 생성하고 초기화하는 상황에서 특정 함수 호출 간의 상태를 유지해야 할 때가 있다. 예를 들어, 여러 번 호출할 때 상태를 기억하고 싶을 때가 있다.
closure를 사용해서 문제를 해결해보자.
closure 기법을 사용해서 함수가 호출된 이후에도 변수를 유지할 수 있다.
function makeCounter() { let count = 0; // 함수가 호출된 이후에도 유지되는 변수 return function() { count++; return count; } } const counter = makeCounter(); console.log(counter()); // 1 console.log(counter()); // 2 console.log(counter()); // 3여기서 count 변수는 makeCounter 함수가 반환한 함수가 호출될 때마다 증가하며, 함수 호출 간의 상태를 유지한다.
비동기 작업이 많은 자바스크립트에서는 비동기 함수가 완료될 때까지 특정 상태나 값을 유지해야 할 때가 있다. 예를 들어, 타이머나 AJAX 요청의 콜백 함수 내에서 특정 변수에 접근하고자 할 때가 있다.
closure를 사용해서 문제를 해결해보자.
function setup() { let message = 'Hello, World!'; setTimeout(function() { console.log(message); }, 1000); } setup(); // 1초 후 'Hello, World!' 출력여기서 setTimeout에 전달된 함수는 setup 함수가 종료된 이후에도 message 변수에 접근할 수 있다.
자바스크립트는 위와 같은 기능을 제공하는 클로저를 채택함으로서 웹서비스를 만드는데 필요한 다양한 기능을 구현할 수 있게 하였다.
https://developer.mozilla.org/ko/docs/Web/JavaScript/Closures
https://www.youtube.com/watch?v=bwwaSwf7vkE