함수를 일급 객체로 취급하는 함수형 프로그래밍의 중요한 특성
함수와 그 함수가 선언된 렉시컬 환경과의 조합 - MDN
여기서 언급된 렉시컬 환경은 함수가 정의될 때 정적으로 결정된 상위 스코프 환경을 말한다.
렉시컬 환경으로 상위 스코프를 결정하는 이유는 함수를 어디에서 호출하든 상관 없이 정의된 위치를 고정 기준으로 참조할 변수를 안정적으로 검색하기 위해서이다.
일반적인 클로저의 정의는 함수 안에 중첩된 내부 함수가 외부 함수 스코프의 식별자(변수 등)를 참조할 수 있는 현상, 또는 그 중첩 함수 자체를 가리킨다.
자유 변수(free variable)
중첩 함수가 참조할 수 있는 외부 함수의 변수
자바스크립트의 모든 함수는 상위 스코프를 기억하므로 이론적으로 모든 자바스크립트 함수는 '클로저'이다.
하지만 보통은 그렇지 않은데, 이유는 클로저로 성립될 수 있는 경우가 정해져 있기 때문이다.
1번을 지키지 않으면 '외부 함수가 종료되어도 내부 함수가 여전히 살아남아 외부 함수의 지역 변수를 참조'할 수 있다는 클로저의 기본 개념에 부합하지 않는다.
2번을 지키지 않으면 브라우저의 최적화에 따라 내부 함수의 상위 스코프 환경(= 외부 함수의 환경)을 따로 기억해두지 않으므로 '내부 함수가 정의될 때의 상위 스코프 환경을 기억해둔다'는 클로저의 정의에 맞지 않는다.
즉,
비로소 클로저라고 할 수 있다.
클로저를 사용하는 이유는 정보 은닉이다.
즉, 상태를 안전하게 숨기고 관리하기 위해서이다.
상태를 숨겨두고 특정 함수에게만 변경을 허용하며 적절하지 못한 접근으로부터 상태를 보호하기 위함이다.