클로저는 자바스크립트 고유의 개념이 아니라, 함수형 프로그래밍 언어 Erlnag, Scala, Haskell, Lisp 에서 사용되는 중요한 특성이다. 클로저는 자바스크립트 고유 개념이 아니기 때문에 ECMAScript 명세에 클로저에 대한 정의가 등장하지 않으므로 MDN 에서 살펴보자
MDN 에서는 아래와 같이 클로저 에 대하여 정의하고 있다.
“A closure is the combination of a function bundled together (enclosed) with references to its surrounding state (the lexical environment).
In other words, a closure gives you access to an outer function's scope from an inner function. In JavaScript, closures are created every time a function is created, at function creation time.”
번역하면 아래와 같다
클로저란 함수가 그 주변 상태 (어휘적 환경) 에 대한 참조와 함께 묶여 있는(포함된) 것이다. 다시 말해, 클로저는 내부 함수에서 외부 함수의 스코프에 접근할 수 있게 해준다. 자바스크립트에서는 함수가 생성될 때마다, 함수 생성 시마다 클로저가 생성된다.
하지만 MDN 의 정의로는 Closure에 대해 정확하게 이해하기 어렵다. 왜냐하면 Closure에 대한 설명이 많은 부분 생략이 되어있기 때문이다. 우선 Closure 란 주변 상태 (어휘적 환경)에 대한 참조와 함께 묶여 있는 것이라고 되어있는데, 여기서 어휘적 환경(Lexical Environment)란 무엇인지에 대해 자세히 알아보자.
Lexical Environment 는 코드가 실행되는 시점에 변수와 함수 식별자에 대해 정보를 저장하는 내부 메커니즘이다. 이 환경은 2가지로 이루어져있다.