
자바스크립트에서 함수 내 지역변수는 상태를 유지하지 않는다. 물론 전역변수를 이용하면 특정 상태를 프로그램 내에서 유지할 수 있지만, 이름이 충돌하거나, 메모리 누수 등 단점이 많으므로 필요한 경우에는 사용하지만 일반적으로는 사용을 최소화하고, 대신 모듈 패턴이나 클로저 등으로 변수의 스코프를 제한한다.
클로저는 자바스크립트에서 주변 상태에 대한 참조와 함께 묶인 함수의 조합이다. 이는 함수가 정의될 때 스코프를 기억하고, 그 스코프 밖에서 함수가 호출되더라도 그 스코프에 접근할 수 있게 해준다.
const myOuter = function () {
let count = 0;
const myInner = () => {
count++;
return count
}
return myInner;
}
const myInnerFn = myOuter();
console.log(myInnerFn()); //1
console.log(myInnerFn()); //2
console.log(myInnerFn()); //3
console.log(myInnerFn()); //4
console.log(myInnerFn()); //5
위 코드에서 myOuter는 myInner를 반환한다. myOuter가 실행된 후에도 반환된 myInner는 여전히 count에 접근할 수 있다. 이는 myInner가 count를 포함한 myOuter의 스코프를 기억하고 있기 때문이다. 이와 같이 myInner가 외부 함수의 변수에 접근할 수 있는 상태가 클로저이다.
크로저는 리액트js의 useState에서 활용되는 문법이다. 리액트와 같은 라이브러리를 추후 사용해야 하기 때문에 개념을 미리 잡아두었다.