클로저는 함수 안에서 새로운 함수를 만들어서 반환하는 경우를 말한다. 자바스크립트의 모든 함수는 클로저를 정의한다. 클로저는 자바스크립트가 가진 강력한 기능으로, 이를 활용하면 변수를 은닉하여 지속성을 보장하는 등의 다양한 기능을 구현할 수 있다. 자바스크립트는 스킴이라는 언어에서 큰 영향을 받았는데, 클로저 또한 그 언어에서 받아들인 기능이다.
클로저(함수 페포)를 프로그래밍 언어적인 관점에서 설명하면 다음과 같은 동작을 하는 함수와 그 기능을 구현한 자료 구조의 모음이라고 할 수 있다.
자기 자신이 정의된 환경에서 함수 안에 있는 자유 변수의 식별자 결정을 실행한다.
식별자 결정:
유효 범위 체인이라는 부분 부터 이야기 해보자. 자바스크립트가 대다수의 언어와 마찬가지로 어휘적 유효 범위를 채용하고 있다는 사실을 알아야 한다. 그래서 변수를 선언하면 그 안쪽에 있는 코드 전체가 그 변수를 사용할 수 있는 유효 범위가 된다. 가령 전역 변수의 유효 범위는 코드 전체고, 함수 안에 있는 지역 변수의 유효 범위는 함수 안에 있는 전체 코드이다. 따라서 중첩 함수와 외부 함수 혹은 전역 코드에서 같은 이름을 가진 변수를 사용하면 충돌이 발생한다. 이때 변수 X가 어디에서 선언된 변수인지 결정하는 작업을 가리켜 변수 x의 식별자 결정이라고 한다. 자바스크립트의 식별자 결정 규칙은 좀 더 안쪽 코드에 선언된 변수를 사용한다는 것이다.
일반적으로 함수의 인수와 지역 변수를 속박 변수라고 하고 그 외 변수를 자유 변수라고 한다. 또 속박 변수만 포함된 함수를 닫힌 함수라고 하고, 자유 변수를 가진 함수를 열린 함수라고 한다. 내부적으로는 변수 직별자 결정에 렉시컬 환경 컴포넌트 안의 외부 렉시컬 환경 참조와 환경 레코드를 사용해서 거슬러 올라가면서 찾아낸다.
즉 함수의 함수 객체와 객체가 참조